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