是否有一个java集合接口,可以保证不会重复,同时保留插入顺序?
这正是LinkedHashSet正在做的事情?但是,我想知道是否还有一个接口保证同样的东西,以避免直接依赖某些特定的类?
SortedSet仅指自然顺序(并且不是由LinkedHashSet实现的)。
基本上,我正在寻找一个接口,它表明元素的迭代顺序是重要的(同时它不包含重复项,即List显然不适用)。
谢谢!
更新这个问题不是要求实现或数据结构(如在标记为重复的问题中)。有几个人指出澄清,我正在寻找一个接口,它要求合同中的两个属性(没有重复和重要的顺序)。应用程序将是我可以将此类对象返回给客户端,而不承诺任何特定的实现。
更新2 此外,与此问题相比,the related question明确要求保留重复项。所以我很确定它不是重复的。
答案 0 :(得分:2)
JDK集合中没有接口提供。
您可以尝试通过合并Set
和List
来构建它。任何实现Set
的集合都不应允许重复元素,任何实现List
的集合都应该保持顺序。
但是,JDK集合中的任何类都不会同时实现Set
和List
。因为遗憾的是LinkedHashSet
没有实现List
。
当然,您可以通过包装LinkedHashSet
(通过合成模式,而不是通过派生)和添加get(int i)
方法,或者通过包装ArrayList
来轻松构建一个实现(再次通过组合)并在尝试添加新元素时抛出IllegalArgumentException
。
最狡猾的部分是IMHO addAll
方法,因为两个接口都用不同的语义定义它(强调我的):
Set
:将指定集合中的所有元素添加到此集合(如果它们尚未存在) List
:将指定集合中的所有元素追加到此列表的末尾,按指定集合的迭代器返回的顺序 由于您无法满足这两个要求,因此源集合包含重复项,我的建议是addAll
在这种情况下抛出IllegalArgumentException
,或者更简单地说它始终抛出UnsupportedOperationException
addAll
是两个接口的可选操作
答案 1 :(得分:-1)
我认为这就是你想要的。
这是演示。
Set<String> s = new LinkedHashSet<String>();
s.add("A");
s.add("B");
s.add("C");
s.add("D");
s.add("A");
Iterator<String> i = s.iterator();
while (i.hasNext()) {
String string = (String) i.next();
System.out.println(string);
}
结果是 一个 乙 C d