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 ответа:
Это была ошибка в 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
не переопределяет соответствующий метод по умолчанию. Очень странный. Это, должно быть, жук, не так ли?