2012-12-15 117 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 - >索引。只要确保您同时插入和从两个地图中删除。