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