Java集合接口,保证不重复以及保留插入顺序

时间:2015-06-01 11:28:58

标签: java collections

是否有一个java集合接口,可以保证不会重复,同时保留插入顺序?

这正是LinkedHashSet正在做的事情?但是,我想知道是否还有一个接口保证同样的东西,以避免直接依赖某些特定的类?

SortedSet仅指自然顺序(并且不是由LinkedHashSet实现的)。

基本上,我正在寻找一个接口,它表明元素的迭代顺序是重要的(同时它不包含重复项,即List显然不适用)。

谢谢!

更新这个问题不是要求实现或数据结构(如在标记为重复的问题中)。有几个人指出澄清,我正在寻找一个接口,它要求合同中的两个属性(没有重复和重要的顺序)。应用程序将是我可以将此类对象返回给客户端,而不承诺任何特定的实现。

更新2 此外,与此问题相比,the related question明确要求保留重复项。所以我很确定它不是重复的。

2 个答案:

答案 0 :(得分:2)

JDK集合中没有接口提供。

您可以尝试通过合并SetList来构建它。任何实现Set的集合都不应允许重复元素,任何实现List的集合都应该保持顺序。

但是,JDK集合中的任何类都不会同时实现SetList。因为遗憾的是LinkedHashSet没有实现List

当然,您可以通过包装LinkedHashSet(通过合成模式,而不是通过派生)和添加get(int i)方法,或者通过包装ArrayList来轻松构建一个实现(再次通过组合)并在尝试添加新元素时抛出IllegalArgumentException

最狡猾的部分是IMHO addAll方法,因为两个接口都用不同的语义定义它(强调我的):

  • Set:将指定集合中的所有元素添加到此集合(如果它们尚未存在)
  • List:将指定集合中的所有元素追加到此列表的末尾,按指定集合的​​迭代器返回的顺序

由于您无法满足这两个要求,因此源集合包含重复项,我的建议是addAll在这种情况下抛出IllegalArgumentException,或者更简单地说它始终抛出UnsupportedOperationException addAll是两个接口的可选操作

答案 1 :(得分:-1)

我认为这就是你想要的。

Linked Hash Map

这是演示。

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