Java:按顺序包含唯一元素的列表

Java:按顺序包含唯一元素的列表,java,list,collections,Java,List,Collections,java中是否有一种列表类型,它按升序存储对象,如果以前添加了此对象,则不会添加。我知道java映射可以做到这一点,但我想知道是否有一种列表类型可以满足我的需要。否则我必须重写contains、equalsTo和add方法,对吗?所以您需要一个只包含唯一元素的列表?两种选择: java.util.LinkedHashSet-保留插入顺序,具有集合语义 来自commons collections-允许列表操作,如get(..)和set(..) 来自commons集合 树集就可以了。例如: Sor

java中是否有一种列表类型,它按升序存储对象,如果以前添加了此对象,则不会添加。我知道java映射可以做到这一点,但我想知道是否有一种列表类型可以满足我的需要。否则我必须重写contains、equalsTo和add方法,对吗?

所以您需要一个只包含唯一元素的列表?两种选择:

  • java.util.LinkedHashSet
    -保留插入顺序,具有集合语义
  • 来自commons collections-允许列表操作,如
    get(..)
    set(..)
  • 来自commons集合

树集就可以了。例如:


SortedSet myOrderedUniqueList=new TreeSet()

我想您需要的是一个SortedSet(这是一个扩展集合的接口)。集合类似于一个列表,但它只包含每个值中的一个

TreeSet是SortedSet的常用实现


这不是一个列表,但您可以查看Set的实现可能正是您所需要的

它将元素存储在已排序的树中。因此,您可以按排序顺序对它们进行迭代。
它不是一个列表,但在添加和包含方面性能更好。

取决于您所指的顺序

  • 排序顺序-使用
  • 插入顺序-使用

使用java.util.LinkedHashSet和重写的hashCode()以及使用唯一属性的equals(Object obj)

SortedSet是Set的子接口,它保证集合中的元素被排序

SortedSet<Integer> orderedSet = new TreeSet<Integer>();
SortedSet orderedSet=new TreeSet();
当您必须按元素值的递增顺序存储非重复元素时,请使用它们

公共静态列表getUniqueListOrdered(列表值){
public static <T> List<T> getUniqueListOrdered(List<T> values) {
    Set<T> uniqueValues = new HashSet<>();
    return values.stream().filter(value -> uniqueValues.add(value)).collect(Collectors.toList());
}


@Test
public void createUnique() {
    List<String> unique = ListUtils.getUniqueListOrdered(Arrays.asList("A", "A", "A", "B", "B"));
    Assert.assertEquals(unique, Arrays.asList("A", "B"));
}
Set uniqueValues=new HashSet(); 返回values.stream().filter(value->uniqueValues.add(value)).collect(Collectors.toList()); } @试验 public void createUnique(){ List unique=ListUtils.getUniqueListOrdered(Arrays.asList(“A”、“A”、“A”、“B”、“B”)); Assert.assertEquals(惟一、数组.asList(“A”、“B”)); }
插入顺序或自然顺序是什么意思?然后派生
ArrayList
并重写
add
方法。在向对象添加对象之前,使用
contains
方法测试对象是否存在。顺序意味着按索引(如列表)访问,对吗?不,不应该重写contains,因为contains取决于内容类型的equals()。您应该重写要存储在集合中的类型的equals方法。(如果使用哈希集合,则使用哈希代码)。无论如何,最好的选择是TreeSet,正如前面提到的。(或者LinkedHashSet,如果你需要保持指令顺序而不是某种自然顺序的话)@Prince John Wesley:覆盖ArrayList不是一个好主意,因为列表在语义上与唯一性无关。除此之外,还有比重新发明轮子更好的解决方案。很抱歉,我忘了告诉你更多关于订单的信息。我想按升序存储对象。顺便感谢您的回复。+1感谢您没有完全忽略询问者的要求,并说他需要一个(任意的)集合。是的,他的要求是“保持秩序”,而
LinkedHashSet
就是这样做的。如果他需要随机访问,他可以使用另一个选项尝试LinkedHashSet,它不提供获取元素索引的方法。如果找不到有序集,那么拥有有序集有什么用呢?这是java8 impl