【问题标题】:Remove duplicates from Array using BitSet?使用 BitSet 从 Array 中删除重复项?
【发布时间】:2022-01-12 17:26:24
【问题描述】:

我正在尝试了解在 stackoverflow 上找到的以下语句的实现

可以使用BitSet,当你遍历值的数组时,将相应的位设置为true。然后你可以遍历该位集并在发现某个位设置为真时输出相应的值

我知道从arrayint 中删除重复项的非常简单的方法。但是很难理解如何使用本网站上的上述声明来实现它。

参考链接

https://stackoverflow.com/questions/3667543/remove-duplicates-from-a-large-integer-array-using-java

谁能建议如何实现它?

【问题讨论】:

  • 如果你使用boolean的数组呢?
  • @ScottHunter,如何帮助删除重复项?
  • BitSet 是一个集合,这意味着每个值只存在一次。第一遍将数组中的所有值(必须包含整数)添加到集合中。然后在第二遍中使用 BitSet 代替数组。 BitSet 包含数组中的唯一值。如果目标是另一个数组,则需要创建一个数组并将值从 BitSet 复制回来。请注意,链接的文章对整数值有限制;如果您的整数可以取任何值,它可能对您不起作用。我不认为 BitSet 是稀疏的,所以它可能必须一直分配位直到你的最大值。
  • 你可以使用任何类型的 Set;正如@ewramner 指出的那样,BitSet 是一种特殊的实现,它施加了某些限制。
  • @ScottHunter 要清楚,BitSet 没有实现 Set,但可以认为它具有类似集合的语义。

标签: java arrays


【解决方案1】:

你可以这样做:

BitSet bs = new BitSet();
// walk the array of values
for (int i : array) {
  // set the corresponding bit to true
  bs.set(i);
}

// walk over the bit set
for (int i = 0; i < bs.size(); ++i) {
  // output the corresponding value whenever you find a bit set to true
  if (bs.get(i)) {
    System.out.println(i);
  }
}

正如ewramner 所指出的,BitSet 不是稀疏的,因此这将为数组中最大值之前的所有内容分配足够的位。如果数组中的值很少,或者它们都比零大很多,这可能会非常低效,将东西放在Set(例如HashSetTreeSet)中会更好选项。


这是一种更有效地遍历 bitset 以寻找真值的方法:

for (int i = -1; (i = bs.nextSetBit(i + 1)) != -1;) {
  System.out.println(i);
}

【讨论】:

    猜你喜欢
    • 2013-12-10
    • 2011-02-22
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多