【问题标题】:Sortable Java collection without duplicates无重复的可排序 Java 集合
【发布时间】:2013-01-31 00:44:45
【问题描述】:

我正在搜索可排序的(我的意思是在初始化后进行排序并且多次使用 Comparator 进行排序)Java 类集合,没有重复项。有没有比编写不透明的代码更纯粹的解决方案,例如阻止一些 ArrayList 添加另一个具有相同值的对象?

编辑 1: 我应该添加一些关于排序的解释。我需要使用不同的比较器(实现的多样性)多次对这组值进行排序。

【问题讨论】:

    标签: java sorting collections duplicates


    【解决方案1】:

    使用Set!常见的实现是HashSetTreeSet。后者在实现SortedSet 时保留了项目的顺序。

    【讨论】:

    • 很高兴您在其中添加了 SortedSet!
    • 你也可以使用 SortedMap ;)
    • @alfasin 是一个 SortedMap 的集合吗?
    • SortedMap 是接口。 TreeMap 是实现,它是一个 Map,而不是一个 Set(它有键)。
    • LinkedHashSet 通常被认为是 Set 的最佳默认实现(参见 Effective Java)。 docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html
    【解决方案2】:
    Set Interface---->SortedSet Interface----->TreeSet Class
    Set Interface---->HashSet Class
    Set Interface---->LinkedHashSet Class
    

    您可以使用TreeSet。它将删除重复项。

    TreeSet 实现SortedSet 接口,以便对输入的元素进行排序

            SortedSet s=new TreeSet();
            s.add(12);
            s.add(12);
            s.add(1);
            s.add(56);
            s.add(6);
            s.add(47);
            s.add(1);
            System.out.println(s);
    

    输出

    [1, 6, 12, 47, 56]
    

    【讨论】:

    • 您应该提到始终保持元素排序的开销。
    • @Woot4Foo 引用javadocs “此实现为基本操作(添加、删除和包含)提供有保证的 log(n) 时间成本。”听起来还不错。
    【解决方案3】:

    对独特的元素使用 Set。您可以随时使用 Collections.sort() 对您使用的任何集合进行排序

    【讨论】:

    • sort 方法的唯一实现是提供排序列表元素:sort(List<T> list, Comparator<? super T> c) sort(List<T> list)
    【解决方案4】:

    这是set

    用法:

    Collection collection = new HashSet();
    

    【讨论】:

    • 不回答所述问题。
    【解决方案5】:

    最好扩展一个标准集合或从头开始实现一个。例如:

    class SetList<E> extends ArrayList<E> {
      boolean add(E e) {
        if (contains(e)) {
          return false;
        } else {
          super.add(e);
          return true;
        }
      }
    
      void add(int index, E e) { .. }
    
      void addAll(..) {..}
    
      void addAll(..) {..}
    }
    

    然后你就得到了Collections.sort,如前所述。不过,我想仔细检查所有内容——我可以想象库方法对 SetList 做出错误的假设,因为它扩展了 ArrayList,从而导致灾难。首先阅读 ArrayList、List 和 Collection 的 javadocs,然后真正考虑从头开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多