Java 是否有一个保留插入顺序的集合也实现了列表?

Java 是否有一个保留插入顺序的集合也实现了列表?,java,collections,Java,Collections,我试图在java中同时找到java.util.List和java.util.Set的实现。我希望这个类只允许唯一的元素(如Set)并保留它们的顺序(如List)。它是否存在于JDK 6中 有List#add(int,T)很重要,这样我就可以插入到一个特定的位置。你是说像LinkedHashSet?这将保留条目的顺序,但不允许重复 class SetList<T> extends ArrayList<T> { @Override public boolean

我试图在java中同时找到
java.util.List
java.util.Set
的实现。我希望这个类只允许唯一的元素(如
Set
)并保留它们的顺序(如
List
)。它是否存在于JDK 6中


List#add(int,T)
很重要,这样我就可以插入到一个特定的位置。

你是说像
LinkedHashSet
?这将保留条目的顺序,但不允许重复

class SetList<T> extends ArrayList<T> {
    @Override
    public boolean add(T t) {
        return !super.contains(t) && super.add(t);
    }

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

    @Override
    public boolean addAll(Collection<? extends T> c) {
        boolean added = false;
        for (T t : c)
            added |= add(t);
        return added;
    }

    @Override
    public boolean addAll(int index, Collection<? extends T> c) {
        boolean added = false;
        for (T t : c)
            if (!super.contains(t)) {
                super.add(index++, t);
                added = true;
            }
        return added;
    }
}
嗯,这是一个不寻常的要求,但你可以写一个没有重复的列表

class SetList<T> extends ArrayList<T> {
    @Override
    public boolean add(T t) {
        return !super.contains(t) && super.add(t);
    }

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

    @Override
    public boolean addAll(Collection<? extends T> c) {
        boolean added = false;
        for (T t : c)
            added |= add(t);
        return added;
    }

    @Override
    public boolean addAll(int index, Collection<? extends T> c) {
        boolean added = false;
        for (T t : c)
            if (!super.contains(t)) {
                super.add(index++, t);
                added = true;
            }
        return added;
    }
}
类集合列表扩展了ArrayList{
@凌驾
公共布尔加法(T){
return!super.contains(t)&super.add(t);
}
@凌驾
公共空添加(整数索引,T元素){
如果(!super.contains(element))super.add(index,element);
}
@凌驾
public boolean addAll(Collection按元素顺序排序;保留插入顺序。希望其中一个就是您想要的

您已经指定要能够在任意位置插入,我想您必须编写自己的-只需创建一个包含
HashSet
ArrayList
的类;添加项目时,在将其添加到列表之前,请检查其是否在集合中


或者,Apache的commons-collections4提供和,它们的行为类似,应该满足给定的要求。

LinkedHashSet就是答案

迭代排序和唯一性


如果您不局限于JDK 6,您可以使用提供完全符合您需要的库-。这就像
列表
组合在一起:)

如果不违反合同,您无法同时实现
列表
。例如,请参见合同:

集合的哈希代码定义为集合中元素的哈希代码之和,其中空元素的哈希代码定义为零

另一方面,合同如下:

列表的哈希代码定义为以下计算的结果:

int hashCode = 1;
for (E e : list)
    hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

因此,不可能实现保证两个契约都能实现的单个类。
的相同问题等于
实现。

我有一个类似的问题,所以我编写了自己的。
索引数组集
扩展了
数组列表
并实现了
集合
,因此它应该支持请注意,将元素插入到<>代码> ARAYLIST/<代码>的中间位置,对于大的列表来说是很慢的,因为所有的元素都需要被移动。我的代码>索引XRaySub < /代码>不会改变。

< P>另一个选项(减去<代码>列表接口要求)是番石榴,保留插入顺序。从:

除已排序的集合外,顺序从构建时开始保留。例如

ImmutableSet.of("a", "b", "c", "a", "d", "b")
将按“a”、“b”、“c”、“d”的顺序迭代其元素


它没有实现<代码>列表< /C>接口,请参阅我对问题的更改没有实现代码>列表接口,请看我对问题的更改看起来更好,因为它没有<代码> O(n)< /C>插入复杂度,在双存储和<代码> O(log(n))之间必须考虑折衷。
插入操作。您的意思是保留它们的插入顺序还是保留由
比较器定义的某个顺序?
?还需要
列表
接口的语义吗?减去
列表
接口