如何在Java中创建唯一/不同对象(无重复)的列表
现在我正在使用HashMap<;字符串,整数>在密钥被覆盖时执行此操作,因此最后我们可以得到唯一的HashMap.getKeySet()。但我相信应该有更好的方法来做到这一点,因为价值部分在这里被浪费了
您可以使用集合实现:
来自JAVADoc的一些信息:
不包含重复元素的集合。更正式地说,集合不包含e1和e2元素对,因此e1.equals(e2)最多包含一个空元素。正如它的名字所暗示的,这个接口为数学集合抽象建模
注意:如果将可变对象用作集合元素,则必须非常小心。当对象是集合中的元素时,如果对象的值以影响相等比较的方式更改,则不会指定集合的行为。这种禁止的一种特殊情况是,不允许集合本身包含为元素`
以下是实现:
-
哈希集
假设散列函数将元素正确地分散在存储桶中,则该类为基本操作(添加、删除、包含和大小)提供恒定的时间性能。迭代这个集合需要的时间与HashSet实例的大小(元素数)加上支持HashMap实例的“容量”(bucket数)之和成比例。因此,如果迭代性能很重要,那么不要将初始容量设置得太高(或负载系数太低),这一点非常重要
迭代
HashSet时,生成元素的顺序未定义 -
链接数据集
哈希表和链表的集合接口实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,即元素插入到集合中的顺序(插入顺序)。请注意,如果将图元重新插入到集合中,则插入顺序不受影响。(如果s.contains(e)在调用前立即返回true时调用s.add(e),则元素e将重新插入到集合s中。)
所以,上面代码的输出
设置<;整数>;linkedHashSet=新linkedHashSet<&燃气轮机;(); linkedHashSet.add(3); linkedHashSet.add(1); linkedHashSet.add(2); for(int i:linkedHashSet){ 系统输出打印LN(i); }…必然是
3 1. 2. -
树集
此实现为基本操作(添加、删除和包含)提供了有保证的日志(n)时间开销。默认情况下,迭代返回的元素按其“自然顺序”排序,因此上面的代码
设置<;整数>;树集=新树集<&燃气轮机;(); 树集。添加(3); 树集。添加(1); 树集。添加(2); 用于(int i:树集){ 系统输出打印LN(i); }…将输出以下内容:
1 2. 3.(您还可以将
比较器实例传递给树集构造函数,使其以不同的顺序对元素进行排序。)请注意,如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致。(请参阅Comparable或Comparator以获得与equals一致的精确定义。)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此此方法认为相等的两个元素是,从集合的角度来看,相等。即使集合的顺序与equals不一致,集合的行为也是定义良好的;它只是没有遵守Set接口的总合同