所以我最初尝试使用
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 的文档也自然秩序。
那么我在文档中遗漏了什么?
我对文档的阅读使我相信他们应该对列表进行相同的排序。有谁明白他们为什么不这样做?
正在从文本文件中读取字符串 user01,user02,user03.user04,user05,user06,user07,user08,user09,user10,user11,user12,user13,user14,user15,user16,user17,user18,user19,user20 用作 map 中的键。
for (String user: userMap.keySet()) {
listOfStrings.add(user);
}
// listOfStrings = listOfStrings.sorted(); //
listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());
最佳答案
这是 Java 8u40 中的一个错误,随后(大部分)已在以后的版本中修复。 (有关边缘案例或替代实现选择的讨论,请参阅此答案的评论)。
错误跟踪器问题:
Java 8u40 code在 ObservableList.java
中是:
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);
}
关于JavaFx ObservableList<String> sorted() 与 sorted(Comparator.<String>naturalOrder()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29854327/