Java 保证不重复并保留插入顺序的集合接口

Java collection interface that guarantees no duplicates as well as preservation of insertion order

有没有java集合接口,既保证不重复,又能保证插入顺序不变?

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

SortedSet 仅指自然顺序(并非由LinkedHashSet 实现)。

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

谢谢!

UPDATE 这个问题不是要求一个实现或数据结构(就像这个被标记为重复的问题一样)。正如一些人指出的那样,我正在寻找一个 接口 ,它在其 合同 中需要两个属性(没有重复和重要的顺序)。对此的应用是,我可以 return 向客户提供这种类型的对象,而无需承诺任何特定的实现。

UPDATE 2 此外,the related question 与此问题相反,特别要求保留重复项。所以我很确定它不是重复的。

JDK 集合中没有接口提供该功能。

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

但是,JDK 集合中没有 class 同时实现 SetList。因为不幸的是 LinkedHashSet 没有实现 List.

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

恕我直言,最棘手的部分是 addAll 方法,因为两个接口都使用不同的语义定义它(强调我的):

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

因为你不能同时满足这两个要求,因为源集合包含重复项,我的建议是 addAll 在这种情况下抛出一个 IllegalArgumentException,或者更简单地说,它总是抛出一个 UnsupportedOperationException 因为 addAll 是两个接口的可选操作