使用 for 循环将整数添加到数组

Adding integers to an array with a for loop

我在从 Java 中的数组中删除重复元素时遇到问题。我做了两个额外的函数,一个计算有多少个唯一元素,另一个检查整数是否已经在结果数组中。一切似乎都正常,但我没有通过测试,其中 0 应该是数组中的第二个,但它总是在我的代码中移到末尾。我该怎么做才能解决这个错误?

测试人员显示此错误:

预期:是 [<100>, <0>, <3>, <4>, <562>]

实际:[<100>、<3>、<4>、<562>、<0>]

到目前为止,这是我的代码:

public static int[] removeDuplicates(int[] integers) {
    int count = countUniques(integers);
    int counter = 0;
    int[] result = new int[count];
    for (int integer : integers) {
        Boolean isInArray = isInArray(result, integer);
        if (!isInArray) {
            result[counter] = integer;
            counter++;
        }
    }
    return result;
}


public static int countUniques(int[] integers) {
    int i, j;
    int count = 0;
    for (i = 0; i < integers.length; ++i) {
        for (j = 0; j < i; j++)
            if (integers[i] == integers[j])
                break;
        if (i == j)
            count++;
    }
    return count;
}

public static Boolean isInArray(int[] integers, int targetInteger) {
    for (int integer : integers) {
        if (targetInteger == integer) {
            return true;
        }
    }
    return false;
}

创建原始 int 数组时,它默认填充 0。您可以更改代码以使用 Integer 对象数组。这样每个元素的默认值将为空。

然后您需要对 isInArray():

中的每个元素进行 null 检查

public static Boolean isInArray(Integer[] integers, int targetInteger) {
    for (Integer integer : integers) {
        if (integer != null && targetInteger == integer) {
            return true;
        }
    }
    return false;
}

并将您的 result 数组更改为 Integer[] result = new Integer[count]; 和 return Integer[] 而不是 int[]。

如果你想 return 原始数组,你可以使用流并将 Integer 映射到 int。

有点像 return Arrays.stream(result).mapToInt(i-> i).toArray();

你还没有填满结果数组,所以它的末尾将用零填充。您只想遍历已填充的部分。实现此目的的一种方法是将计数器的值传递给您的 isInArray 方法。

public static int[] removeDuplicates(int[] integers) {
    int count = countUniques(integers);
    int counter = 0;
    int[] result = new int[count];
    for (int integer : integers) {
        Boolean isInArray = isInArray(result, counter, integer);
        if (!isInArray) {
            result[counter] = integer;
            counter++;
        }
    }
    return result;
}


public static int countUniques(int[] integers) {
    int i, j;
    int count = 0;
    for (i = 0; i < integers.length; ++i) {
        for (j = 0; j < i; j++)
            if (integers[i] == integers[j])
                break;
        if (i == j)
            count++;
    }
    return count;
}

public static Boolean isInArray(int[] integers, int integersLength, int targetInteger) {
    for (int i = 0; i < integersLength; i++) {
        if (targetInteger == integers[i]) {
            return true;
        }
    }
    return false;
}

如果您需要从数组中删除重复项,最简单的方法可能是将数组转换为 java.util.Set,然后将集合转换回数组。

public int[] removeDups(int[] arr) {
    Set<Integer> noDups = new HashSet<>(Arrays.stream(arr).boxed().collect(Collectors.toList()));
    int[] newArr = noDups.stream().mapToInt(Integer::intValue).toArray();
    return newArr;
}

这简化了流程并消除了其他问题,例如您在为未使用的数组索引位置创建一个用零填充的数组时遇到的问题。

要计算“唯一”,请调用此方法然后 return 创建的集合的大小:

public int countUnique(int[] arr) {
    return removeDups(arr).length;
}

此解决方案不需要方法isInArray;顺便说一下,这不应该是 public 方法。在我看来,public 方法不应调用其他 public 方法。原因是需求的变化可能会导致具有依赖性的方法中断。