JavaFXObservableList<;字符串>;排序()与排序(比较器。<;字符串>;naturalOrder())
所以我最初尝试使用JavaFXObservableList<;字符串>;排序()与排序(比较器。<;字符串>;naturalOrder()),java,sorting,javafx,Java,Sorting,Javafx,所以我最初尝试使用 listOfStrings = listOfStrings.sorted(); Ordering user11, user10, user20, user04 etc... 它声明将创建一个具有自然顺序的列表 用户抱怨订购,所以我想我必须写一个比较器,但幸运的是IntelliJ auto填写了 listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder()); Ordering
listOfStrings = listOfStrings.sorted();
Ordering user11, user10, user20, user04 etc...
它声明将创建一个具有自然顺序的列表
用户抱怨订购,所以我想我必须写一个比较器,但幸运的是IntelliJ auto填写了
listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());
Ordering user01, user02, user03, user04 etc...
listofstring=listofstring.sorted(Comparator.naturalOrder());
订购用户01、用户02、用户03、用户04等。。。
我的第一个想法是,它将返回相同的东西,但它会按照我想要的方式对字符串进行排序。有关自然顺序的文档也
那么,我在文档中遗漏了什么
我对文档的阅读使我相信他们应该按同样的顺序排列列表。有人知道他们为什么不知道吗
正在从文本文件读入字符串
user01,user02,user03.user04,user05,user06,user07,user08,user09,user10,user11,user12,user13,user14,user15,user16,user17,user18,user19,user20
在has映射中用作键
for (String user: userMap.keySet()) {
listOfStrings.add(user);
}
// listOfStrings = listOfStrings.sorted(); //
listOfStrings = listOfStrings.sorted(Comparator.<String>naturalOrder());
for(字符串用户:userMap.keySet()){
添加(用户);
}
//listOfStrings=listOfStrings.sorted()//
listOfStrings=listOfStrings.sorted(Comparator.naturalOrder());
我对文档的理解是,两次通话的顺序应该相同。然而,这是我通过查看源代码发现的
以下是ObservableList.sorted()的源代码
public default SortedList sorted(){
返回排序(空);
}
下面是调用的方法
public default SortedList<E> sorted(Comparator<E> comparator) {
return new SortedList<>(this, comparator);
}
公共默认排序列表已排序(比较器比较器){
返回新的分拣列表(此为比较器);
}
以下是相关建造商的文件
public-SortedList(observeList这是Java 8u40中的一个bug,后来(大部分)在以后的版本中得到了修复。(有关边缘情况或替代实现选项的讨论,请参阅此答案上的注释)
bug跟踪程序问题:
还有
java
observeList.java中的
public default SortedList<E> sorted() {
return sorted(null);
}
你能举一个两种不同排序方案的例子吗?当结果不同时,你能举一个可重复的例子吗?我想知道这是否是一个bug,但当它是一个像Java一样使用良好的工具时,我发现我通常会误解一些东西。@Travis。这里也是。我在添加最后一句之前犹豫了一下。这真的非常重要奇怪。谢谢你找到bug追踪器。即使是新版本在我看来也有点不可靠。忽略原始类型的使用,它甚至不是对称的。如果E
是Object
,o1
是“Foo”
和o2
是新对象()
那么比较(o1,o2)
将抛出一个ClassCastException
,而比较(o2,o1)
将与字符串表示进行比较。如果(o1 instanceof Comparable&&o2 instanceof Comparable)
看起来更符合逻辑。我关于修复的问题是,他们不能只使用Comparator.naturalOrder();就像我是为了工作而不是为了重写它吗?特拉维斯,我建议你在中创建一个新问题,让开发人员研究一下,看看是否应该按照pbabcdefp或你自己建议的方向实施一个更好的解决方案-你可以从问题报告中链接回这个堆栈溢出问题。@pbabcdefp:in w当E
是Object
并且o1
是Foo
的类型,o2
是新对象()
时,您认为会发生哪一行ClassCastException
?这两个参数值(最后)都是Object
类型的。
public SortedList(ObservableList<? extends E> source,
Comparator<? super E> comparator)
public default SortedList<E> sorted() {
return sorted(null);
}
/**
* 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);
}