簡體   English   中英

使用 for 循環將整數添加到數組

[英]Adding integers to an array with a for loop

我在從 Java 中的數組中刪除重復元素時遇到問題。我做了兩個額外的函數,一個計算有多少個唯一元素,另一個檢查 integer 是否已經在結果數組中。 一切似乎都正常,但我沒有通過測試,其中 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 object 數組。 這樣每個元素的默認值將是 null。

然后,您需要 null 檢查isInArray()中的每個元素:


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]; 並返回 Integer[] 而不是 int[]。

如果你想返回原始數組,你可以使用流和 map Integer 到 int。

類似於return Arrays.stream(result).mapToInt(i-> i).toArray();

您還沒有填充結果數組,因此它的末尾將填充零。 您只想遍歷已填充的部分。 實現此目的的一種方法是將 counter 的值傳遞給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;
}

這簡化了過程並消除了其他問題,例如您在為未使用的數組索引位置創建一個用零填充的數組時遇到的問題。

要計算“唯一”,請調用此方法,然后返回創建的集合的大小:

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

此解決方案不需要方法isInArray 順便說一句,這不應該是公共方法。 在我看來,公共方法不應該調用其他公共方法。 原因是需求的變化可能會導致具有依賴關系的方法中斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM