【问题标题】:How to not allow duplicate values into an array? [closed]如何不允许重复值进入数组? [关闭]
【发布时间】:2015-05-03 10:39:15
【问题描述】:

我的问题是如何不允许重复值进入数组?例如,我有一个程序应该接受 10 到 100 之间的五个用户输入值,并将它们放入一个数组中。此外,它应该判断用户当前输入的值是否与当前在数组中找到的值重复。如果是这样,则不应记录该值,并且在五个输入结束时,它应该仅输出具有唯一值的数组。例如,用户输入:12、16、30、30、99,最终输出为:12、16、30、99。如何消除重复项?

【问题讨论】:

  • 使用Set
  • 你考虑过HashTable吗?他们在这个确切的任务中非常快速和高效:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
  • 如果只有5个值,很容易for循环并检查该值是否已经存在。
  • @Person123 然后您必须自己检查每个输入,并告诉用户输入一个不同的值,如果它是无效的。我认为这可能是任务的重点。
  • @Jongware Real Programmers™ 使用锋利的磁化针对驱动器上的位进行编码。

标签: java arrays int duplicates duplicate-removal


【解决方案1】:

一种简单的方法是将每个输入存储到 Set 中,因为如果已经存在,它不会添加数据。

不包含重复元素的集合。更正式地说,集合 不包含元素对 e1 和 e2 使得 e1.equals(e2),并且在 最多一个空元素。正如它的名字所暗示的,这个接口模型 数学集合抽象。

请注意,add 方法将在集合尚未包含指定元素时返回 true,如果包含,则更容易记录错误消息。

if(!yourSet.add(input))
    System.out.println("Already exist.");

如果你查看HashSetmap方法的源代码

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

您会注意到所有内容都存储在HashMap 中,然后在每次添加时,如果put 调用返回null,则返回值将为true,如果之前没有此键的映射,则会发生这种情况。

PRESENT 对象只是一个虚拟值,以便能够正确使用 put 方法。

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

如果你真的不能使用Set,这里是如何实现的:

  • 定义一个布尔值,作为一个标志来标记值是否相等。
  • 每次有输入时循环遍历数组的所有数据。
  • 在每次迭代中,仅当数据相等时才将标志设置为 true。
  • 当布尔值设置为 true 时,确保你的循环停止循环

    for(int i = 0; !flag && i < array.length; i++)
    
  • 只有在 flag 的值为 false 时才在循环外添加数据。
  • 将所有这些放在另一个循环中,该循环读取所有用户输入,直到输入 sentinel value

【讨论】:

  • 因为 Set 是合适的数据结构。请看我的回答
  • @hd1 没错.. 已编辑。
【解决方案2】:

使用Set

Set<Integer> aSet = new HashSet<Integer>();
aSet.add(12);
aSet.add(16);
aSet.add(30);
aSet.add(30);
aSet.add(99);
for (Integer number:aSet) {
    System.err.print(number+", ");
}
System.err.println();

这将打印出12, 16, 30, 99,

【讨论】:

  • 但我试图不打印重复项,该输出有两个 30。
  • 你能在相信我的胖手指之前先试一下代码吗?
猜你喜欢
  • 2019-02-24
  • 1970-01-01
  • 2018-10-08
  • 2015-09-06
  • 1970-01-01
  • 2013-01-17
  • 2013-03-23
  • 2014-04-08
  • 1970-01-01
相关资源
最近更新 更多