我希望验证二维数组中的所有整数是否都是唯一的,如果它们是唯一的则返回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;
}
答案 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
的内容。
HashMap<Integer>
。HashMap
是否包含它。return false
,则表示并非数组中的所有元素都是唯一的。HashMap
。 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;
}