当前位置: 首页 > 面试题库 >

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

段干宾白
2023-03-14
问题内容

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

现在HashMap<String, Integer>,由于密钥已被覆盖,因此我正在使用它,因此最后我们可以获得HashMap.getKeySet()唯一的密钥。但是我相信应该有一种更好的方法,因为这里浪费了价值部分。


问题答案:

您可以使用Set实现:

来自JAVADoc的一些信息:

一个不包含 重复元素的集合
。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)最多包含一个空元素。顾名思义,此接口对数学集合抽象进行建模。

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

这些是实现:

  • 哈希集

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

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

  • 链接哈希集

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

此实现为基本操作(添加,删除和包含)提供了保证的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。(有关与equals一致的精确定义,请参见Comparable或Comparator。)之所以如此,是因为Set接口是根据equals操作定义的,但是TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此两个从集合的角度来看,此方法认为相等的元素是相等的。即使集合的顺序与equals不一致,它的行为也是明确定义的;它只是不遵守Set接口的一般约定。



 类似资料:
  • 如何维护唯一数组的? 例如,如果我有以下数组:

  • 我正在尝试登录到一个网站,并获得一个页面站点的页面源后,我用java URLConnection登录到该网站。我面临的问题是我无法维护会话,所以服务器给我这个警告,不让我连接: 该系统要求使用HTTP Cookie来验证授权信息。我们的系统检测到您的浏览器已禁用HTTP Cookie,或不支持它们。有关如何正确配置浏览器以便与此系统一起使用的详细信息,请参阅浏览器中的帮助页。 这是我的源代码:

  • 问题内容: 我已经做了很多关于溢出和谷歌的环顾工作,但是对于我的具体情况,结果都不起作用。 我有一个名为$ holder的占位符数组,值如下: 我正在尝试从此多维数组中提取不同/唯一的值。我想要的最终结果是一个包含(13,121)的变量,或者是(最好是)一个如下数组:Array([0] => 13 [1] => 121) 再次,我尝试了序列化等,但是当在每个数组中使用单个键进行操作时,我不太了解它

  • 问题内容: 我有一个清单: 我不止一次要从列表中删除它。我的结果应该是: 注意: 此处无法正常工作并引发错误。 问题答案: 如果您的值是可哈希的,那么它将起作用: 编辑: 我尝试了一下,没有重复,它似乎工作正常 和

  • 我的问题是每次调用distinctByKey并产生新的ConcurrentHashMap。如何使用新的ConcurrentHashMap<>()维护状态;?

  • 问题内容: 我有一个多维数组设置,如下所示: 在该区域中搜索“名称”中的重复值并将其删除以使多维数组中的每个值都是唯一的最佳方法是什么? 提前致谢! 问题答案: 由于每个人都提供了替代方案,因此这里是解决当前问题的方法。有时,我们必须使用已有的数据,而不必按照自己喜欢的方式进行重新排列。话虽如此,这将从阵列中删除所有重复的后续条目。 看起来像这样: