JavaFx ObservableList sorted() vs sorted(компаратор. naturalOrder())


Поэтому я первоначально попытался использовать

listOfStrings = listOfStrings.sorted();


Ordering user11, user10, user20, user04 etc...

Который имеет JavaDoc который утверждает, что он создаст список с естественным порядком

Пользователь жаловался на порядок, поэтому я думал, что мне придется написать компаратор, но по счастливой случайности IntelliJ auto заполнил

listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());

Ordering user01, user02, user03, user04 etc...
Моей первой мыслью было, что он вернет то же самое, но он сортирует строки, как я хочу. Документация для компаратора .naturalOrder и порядок.

Итак что я пропустил в документации?

Мое чтение документации приводит меня к мысли, что они должны упорядочить список одинаково. Кто-нибудь понимает, почему они этого не делают?

Строки считываются из текстового файла user01, user02, user03.user04,user05,user06,user07,user08,user09,user10,user11,user12,user13,user14,user15,user16,user17,user18,user19,user20 использовать в качестве ключей в карте.

for (String user: userMap.keySet()) {
            listOfStrings.add(user);
}  

// listOfStrings = listOfStrings.sorted();  //
listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());
2 4

2 ответа:

Это была ошибка в Java 8u40, которая впоследствии была (в основном) исправлена для более поздних версий. (См. комментарии к этому ответу для обсуждения крайних случаев или альтернативных вариантов реализации).

Проблема с отслеживанием ошибок:

И связанный набор изменений.


Код Java 8u40 в ObservableList.java таков:

public default SortedList<E> sorted() {
    return sorted(null);
}

Ошибочная последовательность вызова для указанного выше вызова подробно описано в ответе пользователя pbabcdefp. Ошибка в коде в основном означает, что метод sorted() не возвращает сортированный список вообще, а вместо этого возвращает список в текущем порядке, в котором он находится.

В Ява 8У-Дев (текущие междугородным кодом) и Ява 9У-Дев - код:

/**
 * Creates a {@link SortedList} wrapper of this list with the natural
 * ordering.
 * @return new {@code SortedList}
 * @since JavaFX 8.0
 */
public default SortedList<E> sorted() {
    Comparator naturalOrder = new Comparator<E>() {

        @Override
        public int compare(E o1, E o2) {
            if (o1 == null && o2 == null) {
                return 0;
            }
            if (o1 == null) {
                return -1;
            }
            if (o2 == null) {
                return 1;
            }

            if (o1 instanceof Comparable) {
                return ((Comparable) o1).compareTo(o2);
            }

            return Collator.getInstance().compare(o1.toString(), o2.toString());
        }
    };
    return sorted(naturalOrder);
}

Мое чтение документов также заключается в том, что вы должны получить одинаковый порядок для обоих вызовов. Однако это то, что я нашел, посмотрев на исходный код.

Вот исходный код для ObservableList.sorted()

public default SortedList<E> sorted() {
    return sorted(null);
}

И здесь называется метод.

public default SortedList<E> sorted(Comparator<E> comparator) {
    return new SortedList<>(this, comparator);
}

Вот документы для соответствующего конструктора.

public SortedList(ObservableList<? extends E> source,
              Comparator<? super E> comparator)

Создает новый SortedList, обернутый вокруг исходного списка. Список источников будет отсортирован с помощью прилагаемого компаратора. Если указано значение null, список остается неупорядочен и равен списку источников.

Насколько я могу судить, код противоречит документации, если только реализация ObservableList не переопределяет соответствующий метод по умолчанию. Очень странный. Это, должно быть, жук, не так ли?