2014-02-25 293 views
0

在我的程序中,我有一個List of Strings和一個List of integer values它應該從第一個列表中刪除。想想somehing的是這樣的:從arraylist中刪除項目

ArrayList<String> items = new ArrayList<String>(); 
items.add("A"); items.add("B"); items.add("C"); 

ArrayList<Integer> del = new ArrayList<Integer>(); 
del.add(1); del.add(2); 

當然,我可以在循環throught與此代碼列表中刪除的項目:

for (int i = 0; i < del.size(); i++) 
{ 
    items.remove(del.get(i)); 
} 

但這裏的問題。在第一個元素被刪除後,索引被移動,所以我刪除了錯誤的項目。這是否有一個優雅的解決方案?

+6

按相反順序刪除,先刪除較高的索引。 – qqilihq

+4

這是什麼'ArrayList del = new ArrayList ();' – Nambi

+0

當然你是對的。感謝那。所以簡單的解決方案... – Cilenco

回答

3

在排序由高到低依次刪除列表,然後遍歷:

Collections.sort(del, Collections.reverseOrder()); 
for (Integer toDelete : del) { 
    // casting to int, because you need #remove(int), not #remove(Object) 
    items.remove((int)toDelete); 
} 

[編輯]修正。對不起,這在開始時被翻了兩次。

[EDIT2]增加了必要的投:)

+0

很好的答案,沒有想到這一點。此外,請注意我關於使用問題域密鑰而不是索引的答案。 – Thom

+0

** edit2問題**:不應該Java自己封裝/解包封裝器? – Cilenco

+0

不,因爲還有一個'#remove(Object)'方法,如果沒有明確地轉換,這個方法有優先權。 '#remove(Object)'方法會嘗試從列表中移除一個'Object',其中'equals(Object)'爲'true'; '#remove(int)'另一方面通過索引來刪除,這就是你想要的。 – qqilihq

0

優美?我不這麼認爲。一個可行的解決方案是確保您的del列表已排序,然後通過並減少所有後續索引,以便它們進行同步備份。

更好的解決方案是使用特定問題域的密鑰來刪除,而不是數組中的索引。那將是一個優美的解決方案。

+1

你對關鍵的建議是一個很好的建議。但是,對於第一個想法,如果索引列表按降序排序,則不需要同步索引。 –

1

您有幾種選擇,但有兩個簡單一些的是:

  1. 首先刪除最大的指數。按照降序對索引列表進行排序,然後再執行此操作。

  2. 如果排序的索引列表不是出於某種原因,你的字符串列表可行通常不包含null,首先取代所有你想與null刪除然後從字符串列表中的所有null S中的項目(例如while (items.remove(null)) ; )。