Java - 无论如何我可以在不使用ArrayList的情况下阻止数组中的重复项吗?

时间:2016-09-15 17:18:38

标签: java arrays

我正在尝试创建代码以防止重复的数组元素。无论如何我可以在不创建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);
}

5 个答案:

答案 0 :(得分:1)

您可以通过

防止集合中出现重复项
  1. 使用具有合理等于方法的类
  2. 然后使用;因为那些本质上阻止你“收集”重复的人
  3. 另一种方式是:在添加 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]),但这对练习来说很好。