0

我有 2 个 ArrayList,一个包含Strings,另一个包含Integers。list2包含 的元素的索引list1

现在我需要删除所有list1索引为 in的元素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

4 回答 4

4

从给定的最高索引开始排序list2和删除项目。这样你的其他相关索引就不会改变。list1list2list1

你可以这样做:

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

编辑:

正如大卫华莱士在他的评论中指出的那样,上述方法仅在list2. 您可以通过在上面发布的代码之前添加以下行来消除重复项:

list2 = new ArrayList<>(new HashSet<>(list2));
于 2012-12-15T12:56:49.270 回答
3

此解决方案假定 null 不是list1.

您可以遍历list2,并且对于您到达的每个索引,将相应的值设置list1为 null。然后从最后删除所有空值list1。即使 中有重复的元素list2,这也将起作用,而 jlordo 的解决方案将难以处理。

for(Integer index : list2){
    list1.set(index,null);
}
list1.removeAll(Collections.singleton(null));
于 2013-01-25T23:00:15.130 回答
0

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

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

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

于 2012-12-15T13:07:28.603 回答
-3

用于写下代码中的 BaseAdapter 和 getView() 方法以及特定的 onClickListner 实施并尝试此代码,

mArrayList.remove(position);
notifyDataSetChanged();
于 2012-12-15T12:58:12.550 回答