我正在尝试创建代码以防止重复的数组元素。无论如何我可以在不创建arrayList的情况下做到这一点吗?
运行程序时,当我输入第一个#:
时会发生此错误线程中的异常" main" java.lang.ArrayIndexOutOfBoundsException:-1 在DuplicateElimination.main(DuplicateElimination.java:32)
这是我的代码:
int[] numList = new int[5];
int newValue;
boolean invalid;
for (int i = 0; i < numList.length; i++){
do{
System.out.print("Please enter number");
System.out.println(" ");
newValue = input.nextInt();
//This is where the error occurs when I try to compare
//The last list element to the input value
invalid = numList[i-1] == newValue;
if(newValue < 10 || newValue > 100){
System.out.print("Invalid number, Please enter a number between 10 and 100");
newValue = input.nextInt();
}
if(invalid){
System.out.print("That number was entered already try again");
}
}while(invalid);
insertIntoArray(numList, i, newValue);
printArray(numList);
}
答案 0 :(得分:1)
您可以通过
防止集合中出现重复项另一种方式是:在添加 new 元素之前;您只需迭代完整的现有数组,看它是否已包含待添加的东西。如果是这样,您的代码会拒绝添加已知的“新”元素。
本质上:你绝对不需要“第二个”ArrayList来做到这一点。 如果你的应用程序的整个要点是“收集”某些对象,没有重复,那么你只需使用一个Set。你只需踢出阵列;你只需使用一套。
答案 1 :(得分:0)
还有一种方法可以使用“Arrays”类binarySearch方法。
binarySearch方法接受要在数组上搜索的数组和键,并在找到键时返回索引。
数组输入应按排序顺序排列。您可以使用Arrays.sort对数组进行排序并将其用作输入。
示例:
int index = Arrays.binarySearch(Arrays.sort(inputArray),key);
如果找到密钥,请不要将值添加到数组中。否则,将值添加到数组。
答案 2 :(得分:0)
你的代码很好,只有这些启动矩阵的位置,在这里:
invalid = numList[i-1] == newValue;
试试这个:
invalid = numList[i] == newValue;
答案 3 :(得分:0)
如果您想防止重复元素,HashSet是一个不错的选择。
在数组中,您需要一些东西来跟踪重复元素。 HashSet
会在O(1)
时间复杂度中为您完成。
使用HashSet.contains(Object)
,您可以检查元素是否已存在。使用HashSet.toArray(T[])
,您可以在最后获得数组。
关于java.lang.ArrayIndexOutOfBounds
,您的迭代变量从0开始,所以:
if i = 0; numList[i-1] = numList[-1]
这是一个无效的索引,因为数组索引从0开始。因此,要么更改为numList[i]
,要么将循环更改为for(int i = 1; i <= numList.length; i++)
。
答案 4 :(得分:0)
此答案接受您的问题标题,并在不使用my.cool.library {
debug = true
server = "example.com"
}
或其他集合类的情况下防止重复。我将内部ArrayList
循环更改为:
do
这确保最终插入 do {
System.out.print("Please enter number");
System.out.println(" ");
newValue = input.nextInt();
// See if value was already entered; search all array elements left of index i
int ix = 0;
while (ix < i && numList[ix] != newValue) {
ix++;
}
// now either ix == i or numList[ix] == newValue;
// if ix is not i, it means we encountered a duplicate left of index i
invalid = ix < i;
if (invalid) {
System.out.println("That number was entered already, try again");
} else if (newValue < 10 || newValue > 100) {
System.out.println("Invalid number, please enter a number between 10 and 100");
invalid = true;
}
} while (invalid);
的值满足两个条件:它在10到100的范围内,并且不是重复的。在所有先前输入的值中搜索重复项(即,首先没有任何值,因为之前没有输入的值)。
这不是我建议用于制作的代码(而是使用numList[i]
),但这对练习来说很好。