java TreeSet - 不删除重复的项目

发布于 2024-11-05 16:16:27 字数 134 浏览 5 评论 0原文

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

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

TreeSet removes different items with the same Comprator value. I don't want it be removed.
Is there any way to control this? Or use another container class?

Added:
OK. It seems I can't use Set.
I need insert sorting feature, for performance consideration. Can List do this? Thanks all.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

ぇ气 2024-11-12 16:16:27

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

所以你需要使用列表或数组等

A set by definition can not have duplicate entries.

So you need to use a List or Array or such

想你的星星会说话 2024-11-12 16:16:27

即使它是一个集合,这仍然令人困惑,因为对象是不同的。例如,不同对象 ESet 在转换为基于 TreeSet 时会删除一些对象>使用比较器。在这两种情况下,它都是一个集合,但存储的元素集合会不同。在我看来,文档中没有很好地阐明这一点。

一个简单的解决方案,如果你可以改变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;
}

Even it is a set, this is still confusing because the objects are different. For example, a Set<E> of different objects E will drop some objects when converted to a TreeSet<E> based on the Comparator<E> used. In both cases, it is a set, but the set of elements stored will be different. In my opinion this is not clarified well in the docs.

A simple solution, if you can change the Comparator, let it not return 0. For example instead of:

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

Use:

public int compare(Integer o1, Integer o2) {
    return o1 < o2 ? -1: 1;
}
雨的味道风的声音 2024-11-12 16:16:27

Set 的主要用途 就是有重复项。
您要么不需要Set,要么需要不同的Comparator

A main purpose of a Set is to not have duplicates.
You either don't want a Set or you need a different Comparator.

梦一生花开无言 2024-11-12 16:16:27

Set 的 Javadoc 的引用:

不包含重复元素的集合

使用 List< 的任何派生类/a>.

A quote from Javadoc for Set:

A collection that contains no duplicate elements

Use any derivative of List.

流心雨 2024-11-12 16:16:27

例如,如果您想要一个 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;
    }
}

我希望我得到了所有需要排序的函数。 (无需删除即可覆盖)

If you want a SortedList you can for example take a list and manually call Collections.sort() after each insert.

Or you wrap e.g. an ArrayList to ensure the sort-calls for you:

    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;
    }
}

I hope I got all functions which can require sorting. (Remove is not necessary to override)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文