2012-12-15 118 views
0

我有2個ArrayList,一個包含String s,另一個Integer s。 list2包含list1的元素索引。Java中的Arraylist刪除元素

現在我需要從list1中刪除索引號爲list2的所有元素。有任何想法嗎?

ArrayList<String> list1 = new ArrayList<String>(); 
list1.add("a"); 
list1.add("b"); 
list1.add("c"); 
list1.add("d"); 
list1.add("e"); 
list1.add("f"); 

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

這裏的問題是,你不能從原來的list1刪除的指數將不斷變化。我試着創建一個temp HashMap來存儲數組索引和String的關係。

我遍歷list2和map。當我找到匹配鍵=索引時,我跳過了這一點。否則,我將String元素放入新列表中。

有什麼更好的建議嗎?

+0

這兩個列表的最終目標是什麼?擁有兩個並行列表通常是您需要創建一個新類的標誌,它包含兩個列表中的一個元素。 –

+0

@JBNizet只是一個問題,我在接受採訪時被問及正在考慮如何實施它 – HungryForKnowledge

回答

3

該解決方案假定在list1中null不是有效值。

您可以迭代list2,並且對於您獲得的每個索引,將list1中的相應值設置爲null。然後在最後刪除list1中的所有空值。即使在list2中存在重複的元素,這也是可行的,這是生物解決方案難以解決的問題。

for(Integer index : list2){ 
    list1.set(index,null); 
} 
list1.removeAll(Collections.singleton(null)); 
4

排序list2並刪除list1中的項目,從list2中給出的最高索引開始。 這樣你的其他相關索引list1不會改變。

你可以做這樣的:

Collections.sort(list2, Collections.reverseOrder()); 
    for (Integer i : list2) { 
     list1.remove((int) i); 
    } 

編輯:

正如指出的大衛·華萊士在他的評論,上面是否有list2沒有重複的方法纔有效。您可以通過添加以下行擺脫重複上面發佈前的代碼:

list2 = new ArrayList<>(new HashSet<>(list2)); 
+0

hmm ..所以反向排序list2並從list1中移除...有趣! – HungryForKnowledge

+0

它會解決您當前面臨的問題。如果'list2'的順序對你很重要,首先創建它的一個副本並對其進行排序。 – jlordo

+0

@downvoter:留言留言? – jlordo

-3

用於BaseAdapter和getView()內部代碼的方法寫下來,並特別onClickListner imlement,並嘗試了這一點,這個代碼,

mArrayList.remove(position); 
notifyDataSetChanged(); 
+1

'onClickListner'?這個代碼與GUI沒有關係。 – jlordo

0

如果您只關心廣告訂單,則類似LinkedHashMap這樣的工作對此更好。但是,爲了確定一個指標,你將不得不遍歷列表,直到你找到你想要的元素:

int n = 0; 
for (String value : linkedMap) { 
    if (value.equals(valueToSearch)) { 
    break; 
    } 
    ++n; 
} 
// n == index now 

如果你經常需要索引,那麼你可能只想2張地圖。一個持有indexe - > String,另一個持有String - >索引。只要確保您同時插入和從兩個地圖中刪除。