Java和List接口的Java组合

时间:2011-10-15 21:41:03

标签: java list collections set

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

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

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

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

4 个答案:

答案 0 :(得分:10)

来自commons-collections的

SetUniqueList

List<Foo> uniqueList = SetUniqueList.decorate(new ArrayList<Foo>());

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

答案 1 :(得分:1)

我只是扩展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);
    }

}

请注意,add()方法符合the contract

  

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

答案 2 :(得分:0)

创建一个将ArrayList作为其后备存储区的AbstractList子类,如何覆盖大多数方法将它们委托给后备存储区,并覆盖add()以拒绝重复项?

class NoDupesList<E> extends AbstractList<E> {
    private final List<E> backing;

    NoDupesList() {
        backing = new ArrayList<E>();
    }

    public E get(int index) {
        return backing.get(index);
    }

    // ...

    public boolean contains(Object o) {
        return backing.contains(o);
    }

    public boolean add(E e) {
        if (contains(e))
            throw new IllegalArgumentException("duplicates disallowed: " + e):

        return backing.add(e);
    }
 }

答案 3 :(得分:0)

您可以一起使用ArrayList和HashMap:

import java.util.*;

class AS<T>{

    private HashMap<T, Integer> m = new HashMap<T, Integer>();
    private ArrayList<T> a = new ArrayList<T>();

    public void add(T object){
        if (!m.containsKey(object)){
            m.put(object, a.size());
            a.add(object);
        }
    }
    public void remove(T object){
        Integer i = m.get(object);
        if (i!=null){
            a.remove(i.intValue());
            m.remove(object);
        }
    }
    public void remove(int index){
        m.remove(a.get(index));
        a.remove(index);
    }
    public T get(int index){
        return a.get(index);
    }

    public String toString(){return a.toString();}
}