所以我最初尝试使用
listOfStrings = listOfStrings.sorted();
Ordering user11, user10, user20, user04 etc...
其中有JavaDoc表示会创建一个自然排序的列表
用户抱怨订购,所以我想我必须写一个比较器,但幸运的是IntelliJ自动填写
listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());
Ordering user01, user02, user03, user04 etc...
我的第一个想法是,它会返回相同的东西,但它会像我想要的那样对字符串进行排序。 Comparator.naturalOrder的文档也是自然顺序。
那么我在文档中遗漏了什么?
我对文档的阅读使我相信他们应该对列表进行相同的排序。有谁知道他们为什么不这样做?
正在从文本文件中读取字符串 用户01,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());
答案 0 :(得分:4)
这是Java 8u40中的一个错误,后来(大部分)已经修复了以后的版本。 (有关边缘情况或替代实施选择的讨论,请参阅本答案的评论)。
错误跟踪器问题:
ObservableList.java
中的Java 8u40 code是:
public default SortedList<E> sorted() {
return sorted(null);
}
上述呼叫的错误呼叫顺序详见用户pbabcdefp的答案。代码中的错误基本上意味着sorted()
方法根本不返回排序列表,而是以当前顺序返回列表。
Java 8u-dev(当前中继线代码)和Java 9u-dev代码为:
/**
* 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);
}
答案 1 :(得分:2)
我对文档的阅读也是你应该为这两个电话获得相同的订单。然而,这是我通过查看源代码找到的。
以下是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
的实现覆盖相关的默认方法。很奇怪。它肯定是一个错误,当然?