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

标签 java list distinct-values

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

现在我正在使用 HashMap<String, Integer>这样做是因为 key 被覆盖,因此最后我们可以得到 HashMap.getKeySet()这将是独一无二的。但我相信应该有更好的方法来做到这一点,因为这里浪费了值(value)部分。

最佳答案

您可以使用 Set实现:

来自 JAVADoc 的一些信息:

A collection that contains no duplicate elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals(e2), and at most one null element. As implied by its name, this interface models the mathematical set abstraction.

Note: Great care must be exercised if mutable objects are used as set elements. The behavior of a set is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is an element in the set. A special case of this prohibition is that it is not permissible for a set to contain itself as an element.`

这些是实现:

  • HashSet

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

    当迭代 HashSet 时,产生的元素的顺序是不确定的。

  • LinkedHashSet

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

    那么,上面代码的输出...

     Set<Integer> linkedHashSet = new LinkedHashSet<>();
     linkedHashSet.add(3);
     linkedHashSet.add(1);
     linkedHashSet.add(2);
    
     for (int i : linkedHashSet) {
         System.out.println(i);
     }
    

    ...必然是

    3
    1
    2
    
  • TreeSet

    此实现为基本操作(添加、删除和包含)提供有保证的 log(n) 时间成本。默认情况下,迭代返回的元素按它们的“natural ordering”排序,所以上面的代码...

     Set<Integer> treeSet = new TreeSet<>();
     treeSet.add(3);
     treeSet.add(1);
     treeSet.add(2);
    
     for (int i : treeSet) {
         System.out.println(i);
     }
    

    ...会输出这个:

    1
    2
    3
    

    (您也可以将 Comparator 实例传递给 TreeSet 构造函数,使其以不同的顺序对元素进行排序。)

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

关于java - 如何在 Java 中维护唯一列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13259535/

相关文章:

java - 在 Hadoop 中选择不同的记录并使用组合器

jQuery 获取带有标签的所有值并用分隔符连接为单个字符串

java - 模拟蓝牙配件的简单应用程序

Java .contains 方法

java - 返回数组的第一个结构体为空

python - 如何将 'yield' 生成器结果存储在 Python 2.7 的列表中?

android - 如何使用 dart/flutter 中的共享首选项保存和获取列表列表

java - 禁用 Swing 中 GUI 上的按钮

python - 如何将重复的数据行排成一行

Java 8 按属性区分