Массив строк вида Java имен файлов их расширением

Замените ваш код типом

array[i - 1] = numbers[i - 1] - '0';

char типа 2 байта и представляет символ Unicode

, если вы рассматриваете char как int, это будет [ 113] индекс элемента в таблице Unicode

https://unicode-table.com

'0' == 30, а '0' - 30-е элемент в таблице Unicode, '9' является 39-м

, мы не можем вычесть int из char, поэтому мы вычли char из char

, чтобы не делать преобразования между int и char и т. д.

5
задан Adam Lerman 13 January 2009 в 19:32
поделиться

7 ответов

Arrays.sort(filenames, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        // the +1 is to avoid including the '.' in the extension and to avoid exceptions
        // EDIT:
        // We first need to make sure that either both files or neither file
        // has an extension (otherwise we'll end up comparing the extension of one
        // to the start of the other, or else throwing an exception)
        final int s1Dot = s1.lastIndexOf('.');
        final int s2Dot = s2.lastIndexOf('.');
        if ((s1Dot == -1) == (s2Dot == -1)) { // both or neither
            s1 = s1.substring(s1Dot + 1);
            s2 = s2.substring(s2Dot + 1);
            return s1.compareTo(s2);
        } else if (s1Dot == -1) { // only s2 has an extension, so s1 goes first
            return -1;
        } else { // only s1 has an extension, so s1 goes second
            return 1;
        }
    }
});

Для полноты: java.util.Arrays и java.util.Comparator.

20
ответ дан 18 December 2019 в 05:40
поделиться

Если я помню правильно, Arrays.sort (...) берет Компаратор <>, что он будет использовать, чтобы сделать сортировку. Можно обеспечить реализацию его, которая смотрит на дополнительную часть строки.

4
ответ дан 18 December 2019 в 05:40
поделиться

Компараторы часто тверды стать точно правильными, и ключ сравнения должен быть сгенерирован для каждого сравнения, которые для большинства алгоритмов сортировки означают O (n, регистрируют n). Другой подход должен создать (ключ, значение) пары для каждого объекта, необходимо отсортировать, поместить их в TreeMap и затем попросить значения, как они отсортированы согласно ключу.

Например,

import java.util.Arrays;
import java.util.TreeMap;

public class Bar {

    public static void main(String[] args) {
        TreeMap<String, String> m2 = new TreeMap<String, String>();
        for (String string : Arrays.asList(new String[] { "#3", "#2", "#1" })) {
            String key = string.substring(string.length() - 1);
            String value = string;
            m2.put(key, value);
        }
        System.out.println(m2.values());
    }
}

распечатывает

[#1, #2, #3]

Необходимо легко смочь адаптировать ключевое вычисление к проблеме.

Это только вычисляет ключ однажды на запись, следовательно O (n) - (но вид все еще O (n, регистрируют n)). Если ключевое вычисление является дорогим, или n является большим, это могло бы быть довольно измеримо.

2
ответ дан 18 December 2019 в 05:40
поделиться

Можно реализовать пользовательский Компаратор Строк. Заставьте его отсортировать их по подстроке после последнего индекса '.'. Затем передача в компараторе и Вашем массиве в

Arrays.sort(stringArray, yourComparator);

//  An implementation of the compare method
public int compare(String o1, String o2) {
    return o1.substring(o1.lastIndexOf('.')).compareTo(o2.substring(o2.lastIndexOf('.'));
}
3
ответ дан 18 December 2019 в 05:40
поделиться

Создайте свой собственный Компаратор, который рассматривает строки как имена файлов и сравнивает их на основе расширений. Затем используйте Arrays.sort с аргументом Компаратора.

1
ответ дан 18 December 2019 в 05:40
поделиться

Создайте Компаратор и сравните строковые расширения. Смотрите на следующее

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html

Затем передайте в своем Списке строк к Arrays.sort (Список, Компаратор)

1
ответ дан 18 December 2019 в 05:40
поделиться

Если Вы просто хотите сгруппировать файлы их расширением и не заботитесь о фактическом алфавитном порядке, можно использовать это:

Я думаю самая простая вещь, которую можно сделать, это также работает, когда имя файла не имеет a".", должен просто инвертировать имена и сравнить их.

Arrays.sort(ary, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        String r1 = new StringBuffer(o1).reverse().toString();
        String r2 = new StringBuffer(o2).reverse().toString();
        return r1.compareTo(r2);
    }
});

Это - позор, что строка Java даже не имеет реверса ().

-1
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: