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

26

Java中是否有一种列表类型,可以按升序存储对象,并且如果此对象先前已添加,则不会再次添加?我知道Java Maps可以实现这一点,但我想知道是否有一种列表类型可以满足我的需求。否则,我必须重写contains、equalsTo和add方法,对吗?


1
你指的是插入顺序还是自然顺序? - denis.solonenko
然后派生ArrayList并覆盖add方法。在将对象添加到其中之前,使用contains方法测试对象的存在。顺序意味着通过索引访问(如列表)对吗? - Prince John Wesley
不,你不应该覆盖contains方法,因为contains方法依赖于内容类型的equals()方法。你应该覆盖你想要存储在集合中的类型的equals方法(如果你使用哈希集合,则还需要覆盖hashcode方法)。无论如何,最好的选择是TreeSet,正如之前提到的那样。(或者LinkedHashSet,如果你需要保留插入顺序而不是某种自然顺序) - zeller
1
@Prince John Wesley:重写ArrayList并不是一个好主意,因为列表在语义上并不涉及唯一性。除此之外,有比重新发明轮子更好的解决方案。 - zeller
非常抱歉,我忘记告诉你更多关于排序的信息。我想按升序存储我的对象。顺便说一下,谢谢你的回复。 - meandbobbymcgee
9个回答

43

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

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

6
+1 因为没有完全忽略提问者的要求并说他需要一个(任意的)集合。 - G_H
是的,他的要求是“保留顺序”,这正是LinkedHashSet所做的。如果他需要随机访问,他可以使用其他选项之一。 - Bozho

18

1
尝试使用LinkedHashSet,但它没有提供获取元素索引的方法。如果无法找到顺序,那么拥有有序集合的意义是什么? - Paramvir Singh Karwal

4

使用TreeSet可以解决这个问题。例如:

SortedSet<Integer> myOrderedUniqueList = new TreeSet<Integer>()


4

1

TreeSet 可能正是你所需要的。

它将元素存储在排序树中,因此您可以按排序顺序迭代它们。 它不是列表,但在添加和包含方面表现更好。


1

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

SortedSet<Integer> orderedSet = new TreeSet<Integer>();

当你需要按元素值递增顺序存储非重复元素时,可以使用它们。


0
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"));
}

这是Java8的实现。 - Eliko

0
使用具有重写hashCode()和equals(Object obj)方法的java.util.LinkedHashSet,使用唯一的属性。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接