簡體   English   中英

如何刪除數組java中的int的所有重復項

[英]How to remove all duplicates of ints in an array java

我需要創建一種方法來刪除數組中所有出現的整數。 刪除整數后,需要向下移動整個列表,以便在空白處填充下一個整數。 當前,此方法僅刪除1次出現的給定整數。

public void removeAll(int val) {
    for (int n = 0; n < list.length; n++) {  //goes through each integer
        if (list[n] == val) {  //checks if the value is what the user enters
            for (int j = n; j < list.length - 1; j++) {
                list[j] = list[j + 1];
            }
            list[elements - 1] = 0;  //elements is the amount of elements in the array
            elements--;
        }
    }
}

你是如此親密:

我也建議不要使用list.length而是整個elements 否則,當val = 0且list包含0時,算法將中斷。

public void removeAll(int val){
    for(int n = 0; n <elements;n++){  // < -- change from list.length to elements
        if(list[n] == val){  
            for (int j = n; j<elements-1;j++){ // < -- change from list.length to elements
                list[j]=list[j+1];
        }
        list[elements-1]=0; 
        elements--;
        n--;  // <-- Add this line to not skip over the 'n + 1'th term
    }
 }
}

問題在於,當您遍歷集合時,刪除后將跳過下一學期。

例如,說val = 2list = 1 2 2 3 4 4

該算法識別並刪除該值:

1 2 2 3 4 4
  ^

之后,您的數組看起來像這樣,要檢查的下一個位置是n ,現在將其遞增以查看集合中的下一個項目。 不難看出,當符合刪除條件的項目彼此相鄰(相鄰)時(如我的示例),這將是一個問題。

1 2 3 4 4 0
    ^

為了彌補這一事件-你需要遞減n像這樣n--; 當您遇到要從集合中刪除的項目時。 這將使n始終在數組中的同一索引處查找,直到該索引不再被要移除的項目(也就是與相鄰移除條件匹配的項目)占據為止。

更新

如果在整個數組中至少包含一個0情況下,整個數組的計數都不用作上限,並且val = 0發生什么?

我將保持主題不變,並舉例說明問題。

val = 0list = 1 2 0 3 4 4 像往常一樣,算法會識別並刪除該值。

1 2 0 3 4 4
    ^

現在,數組如下所示:

1 2 3 4 4 0
    ^

但是,由於算法仍在迭代集合,直到index等於list.length ,而list.length值仍為6(不會像elements那樣遞減)。 該算法最終將在集合索引5的偽項目處結束。 這是麻煩開始的地方。

1 2 3 4 4 0
          ^

索引永遠不會移動,因為在將它們添加到集合的末尾以表示未使用的索引時,總會有另一個相鄰的0 最終,您的收藏集將如下所示:

0 0 0 0 0 0
          ^

在下面的迭代中,Java將拋出IndexOutOfBoundsException ,因為list[-1] = 0會發生。

希望有幫助!

暫無
暫無

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

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