Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的Arraylist删除元素_Java_Arraylist - Fatal编程技术网

Java中的Arraylist删除元素

Java中的Arraylist删除元素,java,arraylist,Java,Arraylist,我有两个数组列表,一个包含Strings,另一个包含Integers。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");

我有两个数组列表,一个包含
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);
ArrayList list1=新的ArrayList();
清单1.添加(“a”);
清单1.添加(“b”);
清单1.添加(“c”);
清单1.添加(“d”);
清单1.添加(“e”);
清单1.添加(“f”);
ArrayList list2=新的ArrayList();
清单2.添加(1);
清单2.添加(4);
清单2.添加(2);
这里的问题是,您无法从原始
列表1
中删除,因为索引将不断更改。我尝试创建一个临时
HashMap
来存储数组索引和
String
关系

我迭代了
list2
和map。当我找到一个匹配的key=index时,我跳过了它。否则我将
字符串
元素放入新列表中


有更好的建议吗?

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));
list2=newarraylist(newhashset(list2));

排序
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));
list2=newarraylist(newhashset(list2));

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

mArrayList.remove(position);
notifyDataSetChanged();

用于BaseAdapter和getView()方法内部的代码写下和特定onClickListner IMElement,并尝试此代码

mArrayList.remove(position);
notifyDataSetChanged();

如果您只关心插入顺序,那么像
LinkedHashMap
这样的工具可以更好地实现这一点。但是,为了确定索引,您必须迭代列表,直到找到所需的元素:

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

如果您经常需要索引,那么您可能只需要两个映射。一个保存索引->字符串,另一个保存字符串->索引。只需确保同时从两个映射中插入和删除即可。

如果您只关心插入顺序,则类似于
LinkedHashMap
的方法可以更好地实现这一点。但是,为了确定索引,您必须迭代列表,直到找到所需的元素:

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

如果您经常需要索引,那么您可能只需要两个映射。一个保存索引->字符串,另一个保存字符串->索引。只需确保同时插入和删除两个映射。

此解决方案假定null在
列表1中不是有效值

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

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

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

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

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

这两张清单的最终目标是什么?拥有两个平行列表通常是一种迹象,表明您需要创建一个新类,包含两个列表中的一个元素。@jbnize这不仅仅是我在采访中被问到的一个问题,我正在思考如何实现它这两个列表的最终目标是什么?拥有两个平行列表通常是一种迹象,表明您需要创建一个新类,包含两个列表中的一个元素。@jbnize这只是一个在采访中被问到的问题,我正在考虑如何实现ithmm..所以对列表2进行反向排序并从列表1中删除..很有趣!它将解决您当前面临的问题。如果
list2
的顺序对您很重要,请首先创建它的副本并对其进行排序。如果list2中存在任何重复的索引,这将不起作用。您需要在开始之前删除重复项。@DavidWallace:说得好!查看我的编辑。。。(你的答案也是+1)嗯..所以对列表2进行反向排序并从列表1中删除..有趣!它将解决您当前面临的问题。如果
list2
的顺序对您很重要,请首先创建它的副本并对其进行排序。如果list2中存在任何重复的索引,这将不起作用。您需要在开始之前删除重复项。@DavidWallace:说得好!查看我的编辑。。。(你的答案也是+1)