Java和List接口的Java组合

Jam*_*mes 4 java collections list set

我有一个数据结构,我目前正在使用它ArrayList.我意识到在这个结构中我不希望出现任何重复.我的第一个想法是使用某种形式的集合,但顺序也很重要.经过一些谷歌搜索和搜索收藏文档,我发现LinkedHashSet几乎完成了这项工作.不幸的是,保留顺序的一个主要原因是因为我使用get(int index)ArrayList 的方法进行随机访问,我无法看到任何解决方法.

更简洁 - 我需要一个保留顺序并允许随机访问的集合.到目前为止,我所看到的所有类都没有提供此功能.有没有人知道提供这个的课程,还是我必须自己做?如果是后一种情况,在创建人们都知道的这种结构时会有任何陷阱吗?

(或者,从ArrayList或类似结构中检查和删除重复项的快速简便方法就足够了)

编辑:为了清楚起见,将元素添加到列表中的顺序是重要的,而不是它们彼此比较的顺序

Boz*_*zho 10

SetUniqueList 来自commons-collections:

List<Foo> uniqueList = SetUniqueList.decorate(new ArrayList<Foo>());
Run Code Online (Sandbox Code Playgroud)

(不幸的是,commons-collections仍然不支持泛型,所以你必须在这里压制警告)


Bal*_*usC 0

我只想延长ArrayList

public class SetList<E> extends ArrayList<E> {

    @Override
    public boolean add(E e) {
        return contains(e) ? false : super.add(e);
    }

    @Override
    public void add(int index, E e) {
        if (!contains(e)) {
            super.add(index, e);
        }
    }

    @Override
    public boolean addAll(Collection<? extends E> c) {
        return addAll(size(), c);
    }

    @Override
    public boolean addAll(int index, Collection<? extends E> c) {
        Collection<E> copy = new ArrayList<E>(c);
        copy.removeAll(this);
        return super.addAll(index, copy);
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,该add()方法符合合同

确保此集合包含指定的元素(可选操作)。true如果此集合因调用而发生更改,则返回。(false如果此集合不允许重复且已包含指定元素,则返回。)