Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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中从列表列表中删除特定元素?_Java_List_Loops_Arraylist_Java 8 - Fatal编程技术网

如何在java中从列表列表中删除特定元素?

如何在java中从列表列表中删除特定元素?,java,list,loops,arraylist,java-8,Java,List,Loops,Arraylist,Java 8,我使用for循环和deepCopy从列表中删除了特定元素。是否有其他方法可以从列表列表中删除特定元素 import java.util.ArrayList; import java.util.List; public class HelloWorld{ public static void main(String []args){ List<ArrayList<String>> listA = new ArrayList<ArrayL

我使用for循环和deepCopy从列表中删除了特定元素。是否有其他方法可以从列表列表中删除特定元素

import java.util.ArrayList;
import java.util.List;

public class HelloWorld{

     public static void main(String []args){
         List<ArrayList<String>> listA = new ArrayList<ArrayList<String>>();
        ArrayList<String> list1 = new ArrayList<String>();
        list1.add("cucumber");
        ArrayList<String> list2 = new ArrayList<String>();
        list2.add("carrot");
        ArrayList<String> list3 = new ArrayList<String>();
        list3.add("spinach");
        ArrayList<String> list4 = new ArrayList<String>();
        list4.add("kale");
        listA.add(list1);
        listA.add(list2);
        listA.add(list3);
        listA.add(list4);
        System.out.println("Original-->"+listA);

        List<List<String>> deepCopyOfListA = new ArrayList<List<String>>(listA);
        System.out.println("Deepcopy -->"+deepCopyOfListA);

        for (List<String> item : deepCopyOfListA) {
            if (item.contains("kale") || item.contains("cucumber")){
            listA.remove(item);
            }
        }
        System.out.println("Final-->"+listA);
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类HelloWorld{
公共静态void main(字符串[]args){
List listA=new ArrayList();
ArrayList list1=新的ArrayList();
清单1.添加(“黄瓜”);
ArrayList list2=新的ArrayList();
清单2.添加(“胡萝卜”);
ArrayList list3=新的ArrayList();
清单3.添加(“菠菜”);
ArrayList list4=新的ArrayList();
清单4.添加(“羽衣甘蓝”);
添加(列表1);
添加(列表2);
添加(列表3);
添加(列表4);
System.out.println(“原始-->”+listA);
List deepCopyOfListA=新的ArrayList(listA);
System.out.println(“Deepcopy-->”+deepCopyOfListA);
对于(列表项:deepCopyOfListA){
如果(项目包含(“羽衣甘蓝”)|项目包含(“黄瓜”)){
listA.删除(项目);
}
}
System.out.println(“Final-->”+listA);
}
}
从下面的答案来看,这似乎是最方便的。 使用迭代器删除带有if条件的所需元素。经过测试,效果很好。谢谢大家的意见

Iterator<ArrayList<String>> itr = listA.iterator();
    while(itr.hasNext()) {
        List<String> item = itr.next();
        if ((item.contains("cucumber") || item.contains("kale"))) {
            itr.remove();
        }
Iterator itr=listA.Iterator();
while(itr.hasNext()){
列表项=itr.next();
如果((项目包含(“黄瓜”)| |项目包含(“羽衣甘蓝”)){
itr.remove();
}
从开始,如果要从内部列表中删除某个元素,必须先迭代外部元素,然后使用到内部元素:

// Mutates the original list
List<List<String>> outerList = ...            
for (List<String> innerList : outerList) {
    innerList.removeIf(item -> "cucumber".equals(item));
}

// Creates a new one while keeping the original untouched
List<List<String>> newList = outerList.stream()
    .map(innerList -> innerList.stream()
        .filter(item -> !"cucumber".equals(item))
        .collect(Collectors.toList()))
    .collect(Collectors.toList());

在任何情况下,都可以使用
“cumber”.equals(item)
而不是
item.equals(“cumber”)
,因为前者是空友好的。

只需迭代列表,就可以从列表中删除“cumber”。无需创建显式迭代器对象,无需使用奇怪的“流”语法。无需创建副本(深度或浅层)。当然,您可能仍希望创建副本,以便保留原始值,但这取决于您

List<List<String>> ListA=response.path("response.A");
for (List<String> item : ListA) {
    item.remove("cucumber");
}
List ListA=response.path(“response.A”);
用于(列表项:ListA){
项目。移除(“黄瓜”);
}
请注意,如果任何列表碰巧包含多个cumber,这将只删除第一个cumber

DeepCopyOfListA.removeAll(
        ListA.stream()
        .filter(innerList -> innerList.stream()
           .anyMatch(str -> str.contains("cucumber")))
        .collect(Collectors.toList())
);

还想引起您的注意,根据Java代码惯例,您应该用小写字母(事实上是驼峰大小写)命名变量。因此,listA和deepCopyofListA。

不清楚是否要删除完整的内部列表(即)如果它有字符串,
cumber
-或者-您只想从内部列表中删除字符串,
cumber
(即
s)。下面给出了每个场景的解决方案

删除完整的内部列表(即
),如果它包含字符串
cumber

public void removeSpecificElement(Response response) {
    List<List<String>> listA = response.path("response.A");
    Iterator<List<String>> itr = listA.iterator();
    while(itr.hasNext()) {
        List<String> item = itr.next();
        if (item.contains("cucumber")) {
            itr.remove();
        }
    }
}
public void RremoveSpecificElement(Response response) {
    List<List<String>> listA = response.path("response.A");
    for (List<String> item : listA) {
        item.removeAll(Collections.singleton("cucumber"));
    }
}

您正在删除整个列表,而不仅仅是元素您没有制作浅拷贝,也没有制作深拷贝-这是您的实际代码吗?这里有什么问题吗?您的变量
DeepCopyOfListA
不存在,可能您的意思是
DeepCopyOfListA
?从外部列表中删除您使用的实际代码,即完整的内部列表如果列表中有字符串
cumber
,则列表将被删除。这是您想要做的还是只想从内部列表中删除字符串
cumber
?我已经编辑了代码,以使其与我的工作内容相匹配。似乎我以前的代码没有使我的问题足够清楚。希望这次编辑能使问题更清楚。这是错误的。如果“cumber”存在,它将删除整个列表,而不仅仅是该项。是的。我以前有输入错误。否则,我的变量是驼峰式的。我无法在迭代时从同一列表中删除元素。我得到错误“java.util.ConcurrentModificationException”。这就是为什么我必须创建原始列表的deepcopy。使用答案中的代码片段,您在迭代时不会从列表
ListA
中删除元素。您正在对该列表中的单个元素调用方法。我想删除包含字符串cumber的内部列表。使用迭代器是一个好主意。谢谢!
public void RremoveSpecificElement(Response response) {
    List<List<String>> listA = response.path("response.A");
    for (List<String> item : listA) {
        item.removeAll(Collections.singleton("cucumber"));
    }
}