如何在Java中维护唯一列表?

如何在Java中创建唯一/不同对象(无重复)的列表

现在我正在使用HashMap<字符串,整数&gt在密钥被覆盖时执行此操作,因此最后我们可以得到唯一的HashMap.getKeySet()。但我相信应该有更好的方法来做到这一点,因为价值部分在这里被浪费了

您可以使用集合实现:

来自JAVADoc的一些信息:

不包含重复元素的集合。更正式地说,集合不包含e1和e2元素对,因此e1.equals(e2)最多包含一个空元素。正如它的名字所暗示的,这个接口为数学集合抽象建模

注意:如果将可变对象用作集合元素,则必须非常小心。当对象是集合中的元素时,如果对象的值以影响相等比较的方式更改,则不会指定集合的行为。这种禁止的一种特殊情况是,不允许集合本身包含为元素`

以下是实现:

  • 哈希集

    假设散列函数将元素正确地分散在存储桶中,则该类为基本操作(添加、删除、包含和大小)提供恒定的时间性能。迭代这个集合需要的时间与HashSet实例的大小(元素数)加上支持HashMap实例的“容量”(bucket数)之和成比例。因此,如果迭代性能很重要,那么不要将初始容量设置得太高(或负载系数太低),这一点非常重要

    迭代HashSet时,生成元素的顺序未定义

  • 链接数据集

    哈希表和链表的集合接口实现,具有可预测的迭代顺序。此实现与HashSet的不同之处在于,它维护一个贯穿其所有条目的双链接列表。此链表定义了迭代顺序,即元素插入到集合中的顺序(插入顺序)。请注意,如果将图元重新插入到集合中,则插入顺序不受影响。(如果s.contains(e)在调用前立即返回true时调用s.add(e),则元素e将重新插入到集合s中。)

    所以,上面代码的输出

    设置<整数>linkedHashSet=新linkedHashSet&lt&燃气轮机;();
    linkedHashSet.add(3);
    linkedHashSet.add(1);
    linkedHashSet.add(2);
    for(int i:linkedHashSet){
    系统输出打印LN(i);
    }
    

    …必然是

    3
    1.
    2.
    
  • 树集

    此实现为基本操作(添加、删除和包含)提供了有保证的日志(n)时间开销。默认情况下,迭代返回的元素按其“自然顺序”排序,因此上面的代码

    设置<整数>树集=新树集&lt&燃气轮机;();
    树集。添加(3);
    树集。添加(1);
    树集。添加(2);
    用于(int i:树集){
    系统输出打印LN(i);
    }
    

    …将输出以下内容:

    1
    2.
    3.
    

    (您还可以将比较器实例传递给树集构造函数,使其以不同的顺序对元素进行排序。)

    请注意,如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致。(请参阅Comparable或Comparator以获得与equals一致的精确定义。)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此此方法认为相等的两个元素是,从集合的角度来看,相等。即使集合的顺序与equals不一致,集合的行为也是定义良好的;它只是没有遵守Set接口的总合同

发表评论