Java中的Arraylist删除元素

时间:2012-12-15 12:54:05

标签: java arraylist

我有2个ArrayList,一个包含String s,另一个包含Integer s。 list2包含list1元素的索引。

现在我需要删除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中删除,因为索引会不断变化。我尝试创建一个临时HashMap来存储数组索引和String关系。

我迭代list2并映射。当我找到匹配的key = index时,我跳过了。另外,我将String元素放在新列表中。

有更好的建议吗?

4 个答案:

答案 0 :(得分:4)

排序list2并从list1中的最高索引处开始删除list2中的项目。 这样list1中的其他相关索引就不会改变。

你可以这样做:

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

修改

正如David Wallace在评论中指出的那样,只有在list2中没有重复项时,上述方法才有效。您可以通过在上面发布的代码之前添加以下行来删除重复项:

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

答案 1 :(得分:3)

此解决方案假定null不是list1中的有效值。

您可以遍历list2,对于您获得的每个索引,将list1中的相应值设置为null。然后在结尾处从list1中删除所有空值。即使list2中存在重复元素,jlordo的解决方案也会遇到困难,这也会有效。

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

答案 2 :(得分:0)

如果你只是关心插入顺序,像LinkedHashMap这样的东西会更好。但是,为了确定索引,你必须遍历列表,直到找到你想要的元素:

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

如果您经常需要索引,那么您可能只需要2个地图。持有索引的人 - &gt; String和另一个包含String - &gt;指数。只需确保同时插入和删除两个地图。

答案 3 :(得分:-3)

用于代码写下的BaseAdapter和getView()方法,特别是onClickListener实现并尝试这个代码,

mArrayList.remove(position);
notifyDataSetChanged();