无重复的可排序Java集合

4

我正在寻找一个没有重复项的可排序的Java类集合,可在初始化后使用Comparator进行多次排序。是否有比编写代码更纯净的解决方案,它可以防止例如某些ArrayList添加已经存在的另一个具有相同值的对象?

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

5个回答

8

@alfasin SortedMap是一个集合吗? - Woot4Moo
SortedMap是接口。TreeMap是实现它的类,它是一个Map而不是Set(它有键)。 - Aram Kocharyan
确实,它是一个接口,而不是Set,它是Java集合框架的成员:http://docs.oracle.com/javase/6/docs/technotes/guides/collections/index.html - Nir Alfasi
我不确定我理解你的意思。你是指在一个比较器中提供一些排序情况吗?我尝试过这样做,编写了一个带有标志的compare方法,但从外部更改它没有任何效果。class Comparator { ... 一些final字段以提供许多外部实现 ... 和一个保留所选项的字段+setter compare() {if (field) {dosmth}} - user1964668
2
LinkedHashSet通常被认为是Set的最佳默认实现(请参见Effective Java)。http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html - John
显示剩余4条评论

6
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]

你应该提到在整个过程中保持元素排序的开销。 - Woot4Moo
1
@Woot4Foo 引用[javadocs](http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html):“此实现为基本操作(add,remove和contains)提供了确保的log(n)时间成本。”听起来还不错。 - GKFX

1

使用 Set 存储唯一元素。您始终可以使用 Collections.sort() 对使用的任何集合进行排序。


1
sort方法的唯一实现是用于对List元素进行排序的: sort(List<T> list, Comparator<? super T> c) sort(List<T> list) - user1964668

0

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

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的javadoc,并认真考虑从头开始创建一个。


0
这是一个set
用法:
Collection collection = new HashSet();

没有回答所提出的问题。 - GKFX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接