JavaFx ObservableList <string> sorted()vs sorted(Comparator。<string> naturalOrder())

时间:2015-04-24 17:55:21

标签: java sorting javafx

所以我最初尝试使用

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

2 个答案:

答案 0 :(得分:4)

这是Java 8u40中的一个错误,后来(大部分)已经修复了以后的版本。 (有关边缘情况或替代实施选择的讨论,请参阅本答案的评论)。

错误跟踪器问题:

associated changeset

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的实现覆盖相关的默认方法。很奇怪。它肯定是一个错误,当然?