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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

如何在Java中创建唯一列表。

现在我正在使用HashMap<String, Integer>这样做,因为关键字被覆盖,因此最终我们可以得到HashMap.getKeySet()唯一的关键字。但我相信应该有更好的方法来做到这一点,因为这里浪费了价值部分。

提问于
用户回答回答于

你可以使用Set实现:

来自JAVADoc的一些信息:

一个不包含重复元素的集合。更正式地,集合不包含e1和e2这样的元素对,使得e1.equals(e2)和至多一个空元素。正如它的名字所暗示的,这个接口模拟数学集抽象。 注意:如果可变对象用作集合元素,必须非常小心。如果对象的值以影响等于比较的方式更改,而对象是集合中的元素,则不会指定集的行为。这种禁令的一个特例是,一个集合不允许自己作为一个元素。“

这些是实现:

  • HashSet的 这个类为基本操作(添加,删除,包含和大小)提供了恒定的时间性能,假设散列函数在桶之间正确地分散元素。迭代此集合需要的时间与HashSet实例的大小(元素数量)加上支持HashMap实例的“容量”(桶的数量)的总和成正比。因此,如果迭代性能很重要,不要将初始容量设置得太高(或者负载因子太低)是非常重要的。 迭代迭代的HashSet元素的顺序是未定义的。
  • LinkedHashSet Set接口的哈希表和链表实现,具有可预测的迭代顺序。这个实现与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)时间成本。默认情况下,他在迭代中返回的元素按“ 自然顺序排序,所以上面的代码... 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接口,则由集合(无论是否提供显式比较器)维护的排序必须与equals保持一致。(请参阅Comparable或Comparator以获得与equals一致的精确定义。)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,所以两个从这个方法看,被这个方法认为是相等的元素是相等的。即使排序与等号不一致,集合的行为也是明确定义的; 它只是不服从Set接口的总体合同。
用户回答回答于

使用new HashSet<String> 示例:

import java.util.HashSet;
import java.util.Set;

public class MainClass {
  public static void main(String args[]) {
    String[] name1 = { "Amy", "Jose", "Jeremy", "Alice", "Patrick" };

    String[] name2 = { "Alan", "Amy", "Jeremy", "Helen", "Alexi" };

    String[] name3 = { "Adel", "Aaron", "Amy", "James", "Alice" };

    Set<String> letter = new HashSet<String>();

    for (int i = 0; i < name1.length; i++)
      letter.add(name1[i]);

    for (int j = 0; j < name2.length; j++)
      letter.add(name2[j]);

    for (int k = 0; k < name3.length; k++)
      letter.add(name3[k]);

    System.out.println(letter.size() + " letters must be sent to: " + letter);

  }
}

扫码关注云+社区