【问题标题】:is collections.sort method only used for List type of collections?collections.sort 方法是否仅用于 List 类型的集合?
【发布时间】:2014-06-21 21:05:35
【问题描述】:

朋友们,我是 Java-Collection 的新手。我想问Collections.sort() 方法是否仅用于/由List 类型的集合使用。我无法对以下代码进行排序:

Collection collection=new HashSet();
collection.add("zebra");
collection.add("frog");
collection.add("bison");
collection.add("puma");
Collections.sort(collection); //error...why??

我知道HashSet 用于唯一元素。但是有没有办法对这个集合进行排序?

【问题讨论】:

标签: java collections


【解决方案1】:

sort(List<T> list) 的 Collections 是预期类型为 List 的原始方法。但是为了对 Set 进行排序,我们基本上使用 TreeSet,它分别通过 Comparator 和 Comparable 接口的compare()compareTo() 方法对元素进行排序。

【讨论】:

    【解决方案2】:

    错误是因为 Collections 类只支持 List。

    public static <T extends Comparable<? super T>> void sort(List<T> list)
    

    要对您的收藏进行排序,您可以尝试以下操作:

    Collection collection=new HashSet();
    collection.add("zebra");
    collection.add("frog");
    collection.add("bison");
    collection.add("puma");
    ArrayList<String> temp = new ArrayList<String>(collection);
    Collections.sort(temp);
    collection = new HashSet(temp);
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢兄弟。你的temp 对象真的是一个神奇的代码。
    • 在生成散列集之前对集合进行排序是没有意义的。
    • 对于上述情况为真。但是,如果使用 SortedSet,它会有所不同。
    • @Ayman 在之后创建SortedSet 时对集合进行排序也没有意义,因为SortedSet 会自行维护顺序,无论您是否在填充之前对值进行排序。跨度>
    【解决方案3】:

    Java 集合具有不同的语义。

    • List 是一组对象,其中可能包含定义顺序的相等甚至相同元素;

    • Set 是一组不包含相等和相同元素且不指定顺序的对象;

    • SortedSet 与 set 相同,只是它定义了元素顺序 - 它们按 compareTo() 或比较器确定的顺序存储;

    因此,唯一对排序有意义的集合类型是List

    【讨论】:

      【解决方案4】:

      我回答这些问题的第一步是查看 Java 的文档,这对你理解和调试有很大帮助。

      http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html

      如果您查看 sort 方法,那里需要一个 List。

       sort(List<T> list)
      

      它有另一个覆盖的版本,但这也需要一个列表,以及一个比较器。

       sort(List<T> list, Comparator<? super T> c)
      

      这就是您收到错误的原因。没有为排序(HashSet)定义方法

      【讨论】:

        【解决方案5】:

        Collections.sort method 需要一个实现List&lt;T&gt; 接口的集合。这是有道理的,因为列表具有定义的序列。换句话说,您的程序可以完全控制列表中的顺序。

        与列表不同,集合要么无序,要么指定它们自己的特定顺序。这就是为什么尝试对Set 进行排序没有意义的原因:它是集合,而不是您的程序,它定义了集合中项目的顺序。您的程序可以提供自定义排序的逻辑,但您不能采用现有的集合,并从外部对其项目强制使用不同的顺序。

        如果您想按排序顺序获取集合的所有项目,请将您的集合复制到数组列表中,并对结果进行排序。

        【讨论】:

          【解决方案6】:

          没有。根据定义,没有办法对HashSet 进行排序。您可以使用TreeSet而不是tho'。

          【讨论】:

            【解决方案7】:

            是的,Collections.sort 方法仅适用于列表。

            您无法对HashSet 进行排序,但TreeSet 会在您添加项目时自动排序,LinkedHashSet 会按插入顺序排序。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-11-13
              • 1970-01-01
              • 2021-03-24
              • 1970-01-01
              • 2016-06-11
              • 2018-11-25
              • 1970-01-01
              相关资源
              最近更新 更多