Yuv*_*val 80 java collections list duplicates
我知道SortedSet
,但在我的情况下,我需要一些实现List
,而不是Set
.那么在API或其他地方是否有实现?
实现自己应该不难,但我想为什么不先问问这里的人呢?
Cal*_*lum 85
标准库中没有Java集合来执行此操作.但是,LinkedHashSet<E>
保存顺序与a类似List
,所以如果你将你的集合包装在一个List
你想要使用它的时候List
你会得到你想要的语义.
或者,Commons Collections(或者commons-collections4
,对于通用版本)有一个List
你想要的东西:SetUniqueList
/ SetUniqueList<E>
.
小智 12
这是我做的,它的工作原理.
假设我有一个ArrayList
工作,我做的第一件事是创建一个新的LinkedHashMap
.
LinkedHashSet<E> hashSet = new LinkedHashSet<E>()
Run Code Online (Sandbox Code Playgroud)
然后我尝试将我的新元素添加到LinkedHashSet
.LinkedHasSet
如果新元素是重复的,则add方法不会更改并返回false.所以这成为我可以在添加之前测试的条件ArrayList
.
if (hashSet.add(E)) arrayList.add(E);
Run Code Online (Sandbox Code Playgroud)
这是一种简单而优雅的方法,可以防止重复项添加到数组列表中.如果你愿意,你可以将它封装在一个扩展的类中的add方法中ArrayList
.只需记住addAll
通过循环遍历元素并调用add方法来处理.
Yuv*_*val 11
所以这就是我最终做的.我希望这有助于其他人.
class NoDuplicatesList<E> extends LinkedList<E> {
@Override
public boolean add(E e) {
if (this.contains(e)) {
return false;
}
else {
return super.add(e);
}
}
@Override
public boolean addAll(Collection<? extends E> collection) {
Collection<E> copy = new LinkedList<E>(collection);
copy.removeAll(this);
return super.addAll(copy);
}
@Override
public boolean addAll(int index, Collection<? extends E> collection) {
Collection<E> copy = new LinkedList<E>(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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不用列表封装一个集合,就像这样:
new ArrayList( new LinkedHashSet() )
Run Code Online (Sandbox Code Playgroud)
这为真正的Collections大师留下了另一个实现;-)
你应该认真考虑迪勒的回答:
new ArrayList(set)
(或 anew LinkedList(set)
等)中。我认为您发布的解决方案存在NoDuplicatesList
一些问题,主要是contains()
方法方面的问题,而且您的类不处理传递给您的addAll()
方法的集合中的重复项检查。