如何从给定数组中删除重复的整数?

时间:2018-04-20 16:56:34

标签: java arrays

这是我的代码,但是当我尝试运行它时,它会给出一个超出范围的异常。

给定一个int数组,如果数组包含重复值,则返回一个删除了重复整数的int数组。

    removeDuplicateInts({3})  -> {3}
    removeDuplicateInts({1, 2})  -> {1, 2}
    removeDuplicateInts({7, 7})  -> {7}
    removeDuplicateInts({1, 7, 1, 7, 1})  -> {1, 7}
    removeDuplicateInts({1, 2, 3, 4, 5})  -> {1, 2, 3, 4, 5})
    removeDuplicateInts({1, 2, 3, 2, 4, 2, 5, 2})  -> {1, 2, 3, 4, 5}

public static int[] removeDuplicateInts(int[] numbers) {
    ArrayList<Integer> num = new ArrayList<Integer>();
    int[] newNumbers = {};
    for (int i = 0; i < numbers.length; i++) {
            num.add(numbers[i]);
            for(int j = i + 1 ; j < numbers.length; j++) {
                if (numbers[i] == numbers[j]) {
                    num.remove(numbers[i]);
                        }
                }
            }
for(int k = 0; k < num.size(); k++){
        newNumbers[k] = num.get(k);
    }
    return newNumbers;
    }

我不应该使用java.util.Arrays,因此这更具挑战性。

3 个答案:

答案 0 :(得分:3)

您编写的newNumbers[k] = num.get(k);无法正常工作,因为您从未为newNumbers分配了适当大小的新整数数组;你分配了一个大小为零的数组。

另一个问题是这一行:num.remove(numbers[i]);因为您应该传递要删除的索引,而不是值本身。 (编辑:实际上,它也被允许删除(Object o),只要注意你是在那里传递int还是Integer。)

最后,删除循环中存在逻辑错误。如果数字在输入流中出现两次以上,那么您将尝试将其删除太多次;为防止这种情况,您可以使用continue指令退出最内层循环。

答案 1 :(得分:3)

要遵循的步骤:

  1. 注意要求
  2. 阅读Java Collections和流API页面。
  3. 设计一个理智的解决方案。
  4. 实施解决方案。
  5. 要求:

    1. 以数组作为输入。
    2. 删除重复项。
    3. 返回一个数组作为输出。
    4. Java感兴趣的集合:

      1. HashSet的
      2. 解决方案

        1. 将数组元素放入集合中。
        2. 从集合中生成一个新数组。
        3. 返回新阵列。
        4. 实施

          留给学生

答案 2 :(得分:0)

除了已经指出的内容之外,我还想将给定的代码添加为可能的答案。

    public static int[] removeDuplicateInts(int[] numbers) {
    ArrayList<Integer> num = new ArrayList<Integer>();
    int current = numbers[0];
    boolean isDuplicate = false;
    for (int i = 0; i < numbers.length; i++) {
        if (current == numbers[i] && !isDuplicate) {
            isDuplicate = true;
        } else if (current != numbers[i]) {
            num.add(current);
            current = numbers[i];
            isDuplicate = false;
        }
    }
    int[] newNumber = new int[num.size()];
    for(int k = 0; k < num.size(); k ++) {
        newNumber[k] = num.get(k);
    }
    return newNumber;
}

这与你正在做的最大的不同是isDuplicate。这个布尔值将阻止你重新添加一个int。 最后,您将拥有一个适当大小的ArrayList,没有重复项,您可以使用.size()方法作为返回数组的数组长度。