【问题标题】:Why TreeSet has a separate constructor for SortedSet when there is already one for any Collection?当任何 Collection 已经有一个构造函数时,为什么 TreeSet 有一个单独的 SortedSet 构造函数?
【发布时间】:2018-12-07 04:48:45
【问题描述】:

任何 Collection 的构造函数: public TreeSet(Collection<? extends E> c)

SortedSet 的单独构造函数: public TreeSet(SortedSet<E> s)

为什么需要为 SortedSet 单独设置一个?

【问题讨论】:

    标签: java data-structures collections


    【解决方案1】:

    来自接受SortedSet的构造函数的documentation

    构造一个包含相同元素并使用与指定排序集相同的顺序的新树集。

    Collection 初始化TreeSet 时,使用元素的自然顺序,从另一个接受Collection 的构造函数的documentation 可以看出:

    构造一个包含指定集合中元素的新树集,按照其元素的自然顺序排序。

    【讨论】:

    • 所以如果集合不是SortedSet,那么它的排序将丢失,将按照自然排序进行排序。如果它是一个 SortedSet,那么排序将与其Comparator 保持一致。对吗?
    • 感谢您的澄清。
    【解决方案2】:

    TreeSet's doc

    public TreeSet(Collection<? extends E> c)

    构造一个包含指定元素的新树集 集合,根据其元素的自然顺序排序。 插入集合的所有元素都必须实现 Comparable 界面。此外,所有这些元素必须相互比较: e1.compareTo(e2) 不得为任何元素抛出 ClassCastException 集合中的 e1 和 e2。

    更多关注“按照其元素的自然顺序排序

    public TreeSet(SortedSet<E> s)

    构造一个包含相同元素并使用 与指定的排序集相同的顺序。

    【讨论】:

      【解决方案3】:

      让我们用两种不同的方式运行这个程序,

      public static void main(String[] args) {
          List<User> ul = new ArrayList<>();
          ul.add(new User());
          ul.add(new User());
      
          Set<User> users = new TreeSet<>(ul);
      }
      

      首先在下面(这里我们正在实现 Comparator)

      private static class User implements Comparator<User> {
          @Override
          public int compare(User o1, User o2) {
              return 0;
          }
      }
      

      使用此程序,它会在线程“main”java.lang.ClassCastException 中抛出异常:test.WTest$User 无法转换为 java.lang.Comparable

      因为这个构造函数期望用户实现 java.util.Comparable 接口。

      第二次运行,如果你把 User 类的实现改成下面

      private static class User implements Comparable<User> {
      
          @Override
          public int compareTo(User o) {
              return 0;
          }
      }
      

      代码运行良好!注意实现的不同,现在我们正在实现 java.lang.Comparable 接口。

      但是 TreeSet 类可以同时使用 Comparator 或 Comparable。所以构造函数的选择完全取决于你的对象的实现类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 2013-08-28
        相关资源
        最近更新 更多