[英]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 = 2
和list = 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 = 0
且list = 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.