当前位置:  开发笔记 > 编程语言 > 正文

那里有没有重复的List实现吗?

如何解决《那里有没有重复的List实现吗?》经验,为你挑选了4个好方法。

我知道SortedSet,但在我的情况下,我需要一些实现List,而不是Set.那么在API或其他地方是否有实现?

实现自己应该不难,但我想为什么不先问问这里的人呢?



1> Calum..:

标准库中没有Java集合来执行此操作.但是,LinkedHashSet保存顺序与a类似List,所以如果你将你的集合包装在一个List你想要使用它的时候List你会得到你想要的语义.

或者,Commons Collections(或者commons-collections4,对于通用版本)有一个List你想要的东西:SetUniqueList/ SetUniqueList.


@skaffman:他实际上并不是一个白痴,但有时候他会做出......好吧,奇怪的动作.无论如何,我不会在产品中引入错误.在今天的市场上,如果你理解我的观点,我对自己的工作感到满意,并不打算砸门和烧桥.
Commons课程正是我所需要的,但我的老板告诉我最终自己实施.反正10倍!
好吧,没有什么能像重新发明一样!无论如何,你现在都知道是否需要再次出现.馆藏15是一个非常有用的东西; MultiMaps尤其可以减轻人们最终实现自我的痛苦.
当SetUniqueList没有参数化类型时,我很惊讶.
杰弗里:在移动平台上,系统通常会删除未使用的类,但可以肯定的是,有很多原因可能不会导致这些"正常"解决方案失败.总是需要做出一些权衡,没有解决方案可以解决所有情况.

2> 小智..:

这是我做的,它的工作原理.

假设我有一个ArrayList工作,我做的第一件事是创建一个新的LinkedHashMap.

LinkedHashSet hashSet = new LinkedHashSet()

然后我尝试将我的新元素添加到LinkedHashSet.LinkedHasSet如果新元素是重复的,则add方法不会更改并返回false.所以这成为我可以在添加之前测试的条件ArrayList.

if (hashSet.add(E)) arrayList.add(E);

这是一种简单而优雅的方法,可以防止重复项添加到数组列表中.如果你愿意,你可以将它封装在一个扩展的类中的add方法中ArrayList.只需记住addAll通过循环遍历元素并调用add方法来处理.



3> Yuval..:

所以这就是我最终做的.我希望这有助于其他人.

class NoDuplicatesList extends LinkedList {
    @Override
    public boolean add(E e) {
        if (this.contains(e)) {
            return false;
        }
        else {
            return super.add(e);
        }
    }

    @Override
    public boolean addAll(Collection collection) {
        Collection copy = new LinkedList(collection);
        copy.removeAll(this);
        return super.addAll(copy);
    }

    @Override
    public boolean addAll(int index, Collection collection) {
        Collection copy = new LinkedList(collection);
        copy.removeAll(this);
        return super.addAll(index, copy);
    }

    @Override
    public void add(int index, E element) {
        if (this.contains(element)) {
            return;
        }
        else {
            super.add(index, element);
        }
    }
}   


注意 - LinkedList.contains()需要扫描整个列表以确定列表中是否包含对象.这意味着当您将对象添加到大型List时,将扫描整个List以进行每个添加操作(在最坏的情况下).这最终可能会变慢.
此外,您的addAll覆盖不会检查传递给addAll()的集合中的重复项.

4> Daniel Hille..:

为什么不用列表封装一个集合,就像这样:

new ArrayList( new LinkedHashSet() )

这为真正的Collections大师留下了另一个实现;-)


这会将集合复制到列表,但是您没有任何已知的排序。但这就是问题的全部。
此构造函数将Set的内容复制到新List中,而不是将其包装。
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有