你如何检查二维数组中的所有整数是否都是唯一的?

时间:2015-03-07 04:04:33

标签: java arrays

我希望验证二维数组中的所有整数是否都是唯一的,如果它们是唯一的则返回true,否则返回false。 下面的代码是我对一个简单数组的代码。但我不确定如何修改它。

public boolean verifyUniqueIntegers(int array []){
boolean result = true;
   for (int i = 0; i < array.length; i++) {
        if(array[i] <= 0 || array[i] > n*n){
            result = false;
        }
        for (int j = 0; j < i; j++)
            if (array[i] == array[j]) {
                result = false;
            }
    }
    return result;
 }

4 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是使用称为集合的数学结构。为您的目的,集合的关键属性是它们不能按定义包含重复项。 Java提供了一种数据结构,允许我们创建java.util.Set中的集合。这是通用接口,用于指定集合的​​行为方式。但是,接口仅提供规范,而不是实现,因此您必须将Set与另一个实现java.util.HashSet的类Set结合使用。你似乎是一个新手程序员,所以我写了一个测试程序来向你展示它是如何工作的。

import java.util.*;

public class SetTest {
    public static void main(String[] args) {
        int[] set = {1,2,3,4,5,6,7};
        int[] nonSet = {1,2,3,4,5,4};

        System.out.println(verifyUniqueIntegers(set));
        System.out.println(verifyUniqueIntegers(nonSet));
    }

    public static boolean verifyUniqueIntegers(int[] array) {
        Set<Integer> set = new HashSet<Integer>();
        for(int i : array) // This is a construction called a for-each loop
            if(!set.add(i)) // This is an example of what's called autoboxing
                return false;
        return true;
    }
}

为了方便起见,我在这里使用了静态方法,但是一旦你试一试,你当然可以将它改成一个实例方法。

首先,我创建一个for-each循环来迭代传递到verifyUniqueIntegers()的数组中的所有元素。对于每个循环,使用所谓的迭代器来创建对每个元素的引用,一次一个,并使其在循环体中可用。当到达正文的末尾时,for-each循环会自动将i重置为数组中的下一个元素,只要arry中有剩余元素即可。您可以在Oracle Java教程中准备更多关于for-each循环的内容。

然后,该方法调用set.add(i)。这会尝试将i添加到我们之前定义的集合中。这是所谓的自动装箱的一个例子。由于Set接口是通用的,因此它可以包含任何对象类型的元素。由于int是原语,我们必须使用包装类Integer来指定集合中的元素。当我们调用set.add(i)时,您不必将int转换为Integer,因为java编译器会为您执行此操作。

如果true不重复,则此方法返回i,然后将其添加到Set。如果false是重复的,则返回i并且不执行任何操作。因此,我们可以利用该方法检查数组中每个元素的唯一性。一旦找到副本,该方法就会返回false,否则返回true。希望这有帮助,祝你好运!

答案 1 :(得分:0)

你的算法很慢。为了加快速度,您应该使用类似HashMap的内容。

  1. 创建空HashMap<Integer>
  2. 迭代所有2d数组元素(for-for循环)。
  3. 对于每个元素,请检查HashMap是否包含它。
  4. 如果是,那么return false,则表示并非数组中的所有元素都是唯一的
  5. 如果不是,请将元素添加到HashMap
  6. for for for for循环return true

答案 2 :(得分:0)

作为一名初学程序员,选择基本的解决方案,而不是图书馆中更复杂部分的复杂性,这些部分实际上提供了更多的功能。这里最重要的是学习如何使用2D数组。

您可以非常简单地执行此操作,因为您没有提及但在代码中的隐藏规范。没有数字可以大于N * N.

从伪代码开始。基本算法是有一个长度为N * N的检查数组。当你在源数组中找到数字时,在每个元素中放置一个标记,使用数字作为检查数组的索引。如果那里已经存在元素,则该数字不是唯一的。代码变成这样:

final int N = 10;  // Your choice of N, or perhaps input it.
int [][] needsChecking = new int [N] [N];  // fill it up.

public boolean arrayIsGood (int [][] src) {
    final int N2 = N * N;
    boolean [] checker = new boolean [N2];
    for (int i = 0; i < N2; i++) {  // Initialize Checker
        checker [i] = false;
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            int value = src [i][j];
            if ((value <= 0) || (value > N2))
                return false;
            if (checker [value - 1])  // already found
                return false;
            checker [value - 1] = true;
        } // for j
    } // for i
    return true;  // if we get here every element has passed.
} // arrayIsGood (int [][])

其他一些答案更优雅或更具可扩展性或更好地处理空间使用,或者可以更快地找到结果等。但是首先掌握基础知识。

答案 3 :(得分:-1)

public boolean verifyUniqueIntegers(int array []){
    Set<Integer> set = new HashSet<>(array.length);
    for (int i : array)
    {
        if (set.contains(i))
            return false;
        set.add(i);
    }
    return true;
}

或者也许:

public boolean verifyUniqueIntegers(Integer array []){
    return new HashSet<>(Arrays.asList(array)).size() == array.length;
}