如何不允许重复值进入数组?

时间:2015-03-02 22:25:42

标签: java arrays int duplicates duplicate-removal

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

2 个答案:

答案 0 :(得分:2)

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

  

不包含重复元素的集合。更正式的,集合   不包含元素e1和e2对,使得e1.equals(e2)和at   大多数一个null元素。正如其名称所暗示的,这个界面模型   数学集抽象。

请注意,如果该集合尚未包含指定的元素,那么add方法将返回true,这样可以更容易地记录错误消息。

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

如果您查看map

HashSet方法的源代码
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为止。

答案 1 :(得分:1)

使用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,