检查数组中是否存在任何重复索引值?

时间:2011-02-01 23:20:37

标签: java arrays

所以基本上,我有一个数组,有十个值......

int[] input = new int[10];

用户控制每个值的输入。

检查数组内部的任何值是否等于任何其他值的好方法是什么?

编辑:

public static void main(String[] args) {
    P2 numbers = new P2();

    for (int i = 0; i < numbers.input.length; i++) {
        numbers.input[i] = numbers.scan.nextInt();
    }
    numbers.Check();
    if (numbers.Check()) { System.out.println("Duplicate"); }
    if (numbers.Check() == false) { System.out.println("NOT Duplicate"); }
}

public boolean Check() {
        int length = input.length;
        for(int i : input) {
            for(int j = i + 1; j < length; j++) {
                if(input[i] == input[j]) return true;
            }
        }
        return false;
    }

代码的工作原理只要重复的数字是索引邻居就可以了。

4 个答案:

答案 0 :(得分:8)

如果你在数组中只有10个值,那么你最好使用双嵌套循环,当它找到重复时会中断。

int length = input.length;
for(int i = 0; i < length; i++) {
    for(int j = i + 1; j < length; j++) {
        if(intput[i] == input[j]) return true;
    }
}​

如果您希望扩展到一个大数目,那么最好填充一个哈希集,并在找到已经存在于Hashset中的值时中断。

HashSet<Integer> set = new HashSet<Integer>();
for(int i : input) {
    if(set.contains(i)) return true;
    set.add(i);
}​

答案 1 :(得分:1)

你可以

  1. 比较两个循环中的所有值(效率低下)
  2. 对数组进行排序,然后仅比较相邻的值。这样更有效,特别是对于更长的阵列。
  3. 第一个很容易实现,如果你的数组长度只有10,那就足够了。

答案 2 :(得分:1)

如果存储的int值是小的非负值,那么BitSet可能是合适的:

BitSet set = new BitSet();
for(int i : input) {
    if(set.get(i)) return true;
    set.set(i);
}​

如果你有大量的值,而且很多,但是重复的可能性很小(即你希望没有重复,只需要确认),你可以对整数进行散列,并使用散列的低13位的BitSet(8192)(例如)。那只用了大约1k。这可用于轻松确认没有重复项,但如果确实发现了哈希冲突,则需要使用效率较低的方法重新检查。

答案 3 :(得分:0)

您还可以对数组进行排序并快速扫描重复项。与构建哈希集相比,它不会使用尽可能多的内存,但会更慢。