当前位置: 首页 > 知识库问答 >
问题:

如果我经常对项目列表使用contains方法,那么在存储项目列表方面是否有比HashMap更好的DS?

汝承载
2023-03-14

我有一个数字列表。在我的程序中,我会经常检查某个数字是否是我列表的一部分。如果它不在我的列表中,我会将其添加到列表中,否则我什么都不做。我发现自己使用hashmap来存储项目,而不是arraylist。

void add(Map<Integer, Integer> mp, int item){
   if(!mp.containsKey(item)){
      mp.put(item, 1);
   }
}

正如您在上面看到的,我将任何东西作为值,因为我不会使用这些值。我已经测试过这个过程比使用数组列表要快得多。(此外,hashmap的容器键()是O(1),而数组列表的包含()是O(n))

虽然它对我来说效果很好,但感觉很尴尬,原因很简单,它不是正确的数据结构。这是一种好的做法吗?是否有更好的DS供我使用?是否没有使用哈希存储值的列表?

共有1个答案

林亦
2023-03-14

标准库中的另一种解决方案是java。util。位集。在我看来,这只是一个选项,如果项的值不是太大,并且它们相对接近。如果您的值彼此不接近(并且不是从零开始),那么寻找提供稀疏位集或其他稀疏数据结构的第三方解决方案可能是值得的。

您可以使用位设置,例如:

BitSet bits = new BitSet();

void add(int item) {
    bits.set(item);
}

正如厄立特里亚人的评论中建议的那样,您也可以使用Set(例如HashSet)。在内部,HashSet使用HashMap,因此它的性能与您当前的解决方案相似,但它无需在您自己中放置哨兵值(您只需添加或删除项目本身)。

作为一个额外的好处,如果您使用Collection

 类似资料:
  • 问题内容: 我有这样的示例列表: 现在,我检查它是否具有空字符串,如下所示: 这可以正常工作,因为它可以打印True,但是是否需要更多的pythonik方法? 问题答案: 您可以使用: 万一如果内部列表更大(超过100个项目),则与生成器一起使用的速度将比上面的示例更快,因为这样,使用Python for循环的速度代价将由快速操作来补偿: 时序比较:

  • 假设我有一个用户模式/模型,用户有一个朋友列表。Mongoose希望您将好友列表(外键/ObjectID类型)存储为数组,对吗?这意味着如果我想通过ID找到我的朋友,Mongoose将搜索数组,直到找到具有我想要的ID的朋友的第一个实例。那似乎真的是时间低效,不是吗?有更好的办法吗?

  • 本文向大家介绍sharepoint项目。更新列表项,包括了sharepoint项目。更新列表项的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我有一个结构如下的JSON: 当我用下面的代码反序列化对象时,引用对象列表“item”给出了错误:“JSONMappingException:Can not反序列化java.util.ArrayList实例out of START_OBJECT token” 对于我来说,在一次调用中重新获得父对象Firebase和它们的子对象,对json来说,最好的POJO是什么?

  • 问题内容: 我正在从表单文本字段,并从复选框中的字段 我将它们像这样组合: (此函数在列表中的字符串内去除空格。) 但在这种情况下是空的(没有新的标签进入),但也有一些,包含一个空字符串。 例如,来自: 我如何摆脱空字符串? 如果列表中有一个空字符串: 但是,如果没有空字符串: 但这给出了: 为什么会发生这种情况,我该如何解决? 问题答案: 1)几乎是英式风格: 使用操作员测试是否存在,然后应用该

  • 问题内容: 在我的一些代码中,我将一系列对象放入列表中,并根据其属性(即字符串)构建了另一个列表。我需要确定第二个列表中的所有项目是否具有完全相同的值,而无需事先知道它是哪个值,然后返回布尔值,以便根据结果在代码中可以做不同的事情。 我事先不知道属性的名称,这就是为什么我试图使某些属性尽可能通用。 为了使示例更清楚,一个理想的函数“ all_same”将像这样工作: 我当时想制作一个唯一元素列表,