簡體   English   中英

Java數組刪除會帶來意想不到的結果嗎?

[英]Java array removal gives unexpected results?

以下代碼是程序的一部分,該程序采用數組ar的值(變量z除外)並將其復制到另一個名為ar2的數組中。 結果應為除負數2(19、1、17、17)以外的所有數字,但當前結果為19 1 17 17 -2 19 1 17 17 -2 19 1 17 17 -2 19 1 17 17 -2。

public class Second_tiny {

    public static void main(String[] args) {
        int[] ar = { 19, 1, 17, 17, -2 };
        int z = ar[0];

        for (int i = 0; i < (ar.length); i++) {
            if (z > ar[i]) {
                z = ar[i];

            }
        }
        // second pass
        int[] ar2 = new int[ar.length];
        int zero = 0;
        for (int x = 0; x < (ar.length); x++) {
            if (ar[x] == z) {
                continue; // If it is equal to z go back to the loop again

            }
            ar2[zero++] = ar[x];

            for (int i = 0; i < ar.length; i++) {
                System.out.println(ar[i]);
            }
            /*
             * //2nd pass copy all items except smallest one to 2nd array int[] ar2= new int[ar.length-1]; int curIndex = 0; for (i=0; i<ar.length; i++) { if (ar[i]==z) continue; ar2[curIndex++] =
             * ar[i]; }
             */

        }

    }
}    

Java 8方式:

        int[] ar = { 19, 1, 17, 17, -2 };
        int min = Arrays.stream(ar).min().getAsInt();
        int[] ar2 = Arrays.stream(ar).filter(s -> s!=min).toArray();
        System.out.println(Arrays.toString(ar2));

您在此塊中將原始陣列打印4次:

for (int i = 0; i < ar.length; i++) {
    System.out.println(ar[i]);
}

該塊應該在循環之外,並且應該引用ar2而不是ar

for (int x = 0; x < (ar.length); x++) {
    if (ar[x] == z) {
        continue; // If it is equal to z go back to the loop again
    }

    ar2[zero++] = ar[x];
}

for (int i = 0; i < ar2.length; i++) {
    System.out.println(ar2[i]);
}

這將為您提供以下結果:

19
1
17
17
0

最后一個0出現是因為0int的默認值。 您的ar2 5個元素,對於最后一個元素,永遠不會替換默認值。

您可以使用Math.min(int, int)來確定最小值。 您的第二個數組應該小一個元素。 我建議您避免刪除多個值。 您可以使用Arrays.toString(int[])來打印第二個array 就像是,

int[] ar = { 19, 1, 17, 17, -2 };
int z = ar[0];
for (int i = 1; i < ar.length; i++) {
    z = Math.min(z, ar[i]);
}
// second pass
int[] ar2 = new int[ar.length - 1];
boolean first = true;
for (int x = 0; x < ar.length; x++) {
    if (ar[x] == z && first) {
        first = false;
        continue; // If it is equal to z go back to the loop again
    }
    int y = x - (!first ? 1 : 0);
    ar2[y] = ar[x];
}
System.out.println(Arrays.toString(ar2));

輸出是

[19, 1, 17, 17]

在此處輸入圖片說明 您的代碼錯誤是對的,您給了一個額外的for循環。我對for循環做了注釋。使用以下代碼,您將獲得所需的輸出。

公共類HelloWorld {

    public static void main(String[] args) {
        int[] ar = { 19, 1, 17, 17, -2 };
        int z = ar[0];

        for (int i = 0; i < (ar.length); i++) {
            if (z > ar[i]) {
                z = ar[i];

            }
        }
        // second pass
        int[] ar2 = new int[ar.length];
        int zero = 0,i=0;

        for (int x = 0; x < (ar.length); x++) {
            if (ar[x] == z) {
                continue; // If it is equal to z go back to the loop again

            }
            ar2[zero++] = ar[x];

          //  for (int i = 0; i < ar.length; i++) {
                System.out.println(ar[i]);
                i++;
          //  }
            /*
             * //2nd pass copy all items except smallest one to 2nd array int[] ar2= new int[ar.length-1]; int curIndex = 0; for (i=0; i<ar.length; i++) { if (ar[i]==z) continue; ar2[curIndex++] =
             * ar[i]; }
             */

        }

    }
}    

輸出為:

19

1

17

17

暫無
暫無

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

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