JavaFx ObservableList<String> sorted() 与 sorted(Comparator.<String>naturalOrder())
JavaFx ObservableList<String> sorted() vs sorted(Comparator.<String>naturalOrder())
所以我最初尝试使用
listOfStrings = listOfStrings.sorted();
Ordering user11, user10, user20, user04 etc...
其中 JavaDoc 声明它将创建一个具有 自然排序
的列表
用户抱怨排序,所以我想我必须写一个比较器,但幸运的是 IntelliJ 自动填写
listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());
Ordering user01, user02, user03, user04 etc...
我的第一个想法是它会 return 同样的事情,但它会按照我想要的方式对字符串进行排序。 Comparator.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());
我对文档的阅读也是,您应该为两个调用获得相同的顺序。然而,这是我通过查看源代码发现的。
这是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)
Creates a new SortedList wrapped around the source list. The source list will be sorted using the comparator provided. If null is provided, the list stays unordered and is equal to the source list.
据我所知,代码与文档相矛盾,除非 ObservableList
的实现覆盖了相关的默认方法。很奇怪。这肯定是一个错误,对吧?
这是 Java 8u40 中的一个错误,随后(大部分)已为以后的版本修复。 (有关边缘案例或替代实施选择的讨论,请参阅此答案的评论)。
错误跟踪器问题:
ObservableList.java
中的Java 8u40 code是:
public default SortedList<E> sorted() {
return sorted(null);
}
上述调用的错误调用顺序在用户pbabcdefp的回答中有详细说明。代码中的错误基本上意味着 sorted()
方法根本不是 return 排序列表,而是 return 按当前顺序排列的列表。
Java 8u-dev (current trunk code) and 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);
}
所以我最初尝试使用
listOfStrings = listOfStrings.sorted();
Ordering user11, user10, user20, user04 etc...
其中 JavaDoc 声明它将创建一个具有 自然排序
的列表用户抱怨排序,所以我想我必须写一个比较器,但幸运的是 IntelliJ 自动填写
listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());
Ordering user01, user02, user03, user04 etc...
我的第一个想法是它会 return 同样的事情,但它会按照我想要的方式对字符串进行排序。 Comparator.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());
我对文档的阅读也是,您应该为两个调用获得相同的顺序。然而,这是我通过查看源代码发现的。
这是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)
Creates a new SortedList wrapped around the source list. The source list will be sorted using the comparator provided. If null is provided, the list stays unordered and is equal to the source list.
据我所知,代码与文档相矛盾,除非 ObservableList
的实现覆盖了相关的默认方法。很奇怪。这肯定是一个错误,对吧?
这是 Java 8u40 中的一个错误,随后(大部分)已为以后的版本修复。 (有关边缘案例或替代实施选择的讨论,请参阅此答案的评论)。
错误跟踪器问题:
ObservableList.java
中的Java 8u40 code是:
public default SortedList<E> sorted() {
return sorted(null);
}
上述调用的错误调用顺序在用户pbabcdefp的回答中有详细说明。代码中的错误基本上意味着 sorted()
方法根本不是 return 排序列表,而是 return 按当前顺序排列的列表。
Java 8u-dev (current trunk code) and 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);
}