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);
}