繁体   English   中英

Java中的Arraylist删除元素

[英]Arraylist in Java removing elements

我有2个ArrayList,一个包含String ,另一个包含Integer 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元素放入新列表中。

还有更好的建议吗?

list2排序,并从list2给定的最高索引开始,从list1删除项目。 这样,您在list1其他相关索引将不会更改。

您可以这样做:

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

编辑:

正如David Wallace在其评论中指出的那样,上述方法仅在list2中没有重复项的情况下才有效。 通过在上面的代码之前添加以下行,可以消除重复项:

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

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

您可以遍历list2 ,对于获得的每个索引,将list1的相应值设置为null。 然后从列表list1的最后删除所有空值。 即使list2存在重复的元素,这也会起作用,而jlordo的解决方案将很难解决这个问题。

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

如果您只关心插入顺序,那么类似LinkedHashMap更好。 但是,为了确定索引,您必须遍历列表,直到找到所需的元素:

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

如果您经常需要索引,那么您可能只需要2张地图。 一个持有indexe-> String,另一个持有String-> index。 只要确保您同时插入和删除两个地图即可。

用于代码内的BaseAdapter和getView()方法,并写下特定的onClickListner元素,并尝试以下代码,

mArrayList.remove(position);
notifyDataSetChanged();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM