14

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

补充:好的。看来我不能使用Set。出于性能考虑,我需要插入排序功能。List可以做到这一点吗?谢谢大家。

4

5 回答 5

11

根据定义,集合不能有重复的条目。

所以你需要使用 List 或 Array 之类的

于 2011-05-05T09:34:05.087 回答
6

即使它是一个集合,这仍然令人困惑,因为对象不同。例如,一个Set<E>不同的E对象在转换为一个TreeSet<E>基于Comparator<E>使用的对象时会丢弃一些对象。在这两种情况下,它都是一个集合,但存储的元素集合会有所不同。在我看来,这在文档中没有得到很好的说明。

一个简单的解决方案,如果您可以更改 Comparator,则让它不返回 0。例如,而不是:

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

利用:

public int compare(Integer o1, Integer o2) {
    return o1 < o2 ? -1: 1;
}
于 2016-08-27T20:27:16.143 回答
4

a 的主要目的Set重复。您要么不想要 a Set,要么需要不同的Comparator.

于 2011-05-05T09:33:52.013 回答
3

来自Javadoc的 Set 引用:

不包含重复元素的集合

使用List的任何衍生物。

于 2011-05-05T09:31:19.707 回答
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;
    }
}

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

于 2015-07-13T05:11:49.120 回答