java TreeSet - 不删除重复的项目

时间:2011-05-05 09:28:04

标签: java comparator treeset

TreeSet使用相同的Comprator值删除不同的项目。我不希望它被删除。 有没有办法控制这个?或者使用另一个容器类?

添加了: 好。好像我不能用Set。 出于性能考虑,我需要插入排序功能。 Can List可以这样做吗?谢谢大家。

5 个答案:

答案 0 :(得分:10)

按定义设置的集不能有重复的条目。

所以你需要使用List或Array等

答案 1 :(得分:5)

即使它是一个集合,这仍然令人困惑,因为对象是不同的。例如,Set<E>个不同的对象E会在根据所使用的TreeSet<E>转换为Comparator<E>时删除某些对象。在这两种情况下,它都是一个集合,但存储的元素集将是不同的。在我看来,这在文档中并未得到很好的澄清。

一个简单的解决方案,如果您可以更改比较器,则不要返回0.例如,而不是:

public int compare(Integer o1, Integer o2) {
    return o1.compareTo(o2);
}

使用:

public int compare(Integer o1, Integer o2) {
    return o1 < o2 ? -1: 1;
}

答案 2 :(得分:4)

Set的主要目的是有重复项。 您要么不想要Set,要么需要不同的Comparator

答案 3 :(得分:3)

Javadoc对集合的引用:

  

不包含重复元素的集合

使用List的任何衍生物。

答案 4 :(得分:1)

如果你想要一个SortedList,你可以拿一个列表并在每次插入后手动调用Collections.sort()。

或者你包裹,例如一个ArrayList,以确保为您调用排序:

    class SortedArrayList extends ArrayList<String> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void add(int index, String element) {
        super.add(index, element);
        Collections.sort(this);
    }

    @Override
    public boolean add(String element) {
        boolean returnValue = super.add(element);
        Collections.sort(this);
        return returnValue;
    }

    @Override
    public boolean addAll(Collection<? extends String> c) {
        boolean returnValue = super.addAll(c);
        Collections.sort(this);
        return returnValue;
    }

    @Override
    public boolean addAll(int index, Collection<? extends String> c) {
        boolean returnValue = super.addAll(index, c);
        Collections.sort(this);
        return returnValue;
    }

    @Override
    public String set(int index, String element) {
        String returnValue = super.set(index, element);
        Collections.sort(this);
        return returnValue;
    }
}

我希望我得到所有需要排序的功能。 (删除不需要覆盖)