Как удалить указанный элемент c из списка в списке java? - PullRequest
0 голосов
/ 10 апреля 2020

Я удалил указанный элемент c из списка списка, используя для l oop и делая deepCopy. Есть ли другой способ удалить указанный элемент c из списка List?

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);
    }
}

Из приведенных ниже ответов это показалось наиболее удобным. Использование Iterator для удаления нужных элементов с условием if. Протестировано и работает отлично. Спасибо всем за ваш вклад.

Iterator<ArrayList<String>> itr = listA.iterator();
    while(itr.hasNext()) {
        List<String> item = itr.next();
        if ((item.contains("cucumber") || item.contains("kale"))) {
            itr.remove();
        }

Ответы [ 4 ]

0 голосов
/ 10 апреля 2020

Не ясно, хотите ли вы удалить полный внутренний список (т. Е. item), если в нем есть строка, cucumber -ИЛИ- вы хотите удалить только строку, cucumber из внутренних списков ( т.е. item с). Ниже приведены решения для каждого из этих сценариев ios.

Чтобы удалить полный внутренний список (т. Е. item), если в нем есть строка cucumber:

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();
        }
    }
}

Чтобы удалить только строку, cucumber из внутреннего списка (т.е. item):

public void RremoveSpecificElement(Response response) {
    List<List<String>> listA = response.path("response.A");
    for (List<String> item : listA) {
        item.removeAll(Collections.singleton("cucumber"));
    }
}

Не стесняйтесь комментировать в случае каких-либо сомнений / выпуск.

0 голосов
/ 10 апреля 2020

Вы можете удалить «огурец» из списка списков, просто выполнив итерацию списка. Нет необходимости создавать явные объекты итератора, не нужно использовать странный синтаксис «потока». Не нужно создавать копию - глубокую или мелкую. Конечно, вы можете захотеть создать копию в любом случае, чтобы у вас все еще были исходные значения - но это ваше дело.

List<List<String>> ListA=response.path("response.A");
for (List<String> item : ListA) {
    item.remove("cucumber");
}

Обратите внимание, что если в любом из списков окажется более одного огурца , это удалит только первый.

0 голосов
/ 10 апреля 2020
DeepCopyOfListA.removeAll(
        ListA.stream()
        .filter(innerList -> innerList.stream()
           .anyMatch(str -> str.contains("cucumber")))
        .collect(Collectors.toList())
);

Также хочу обратить ваше внимание на то, что согласно Java Кодовой конвенции вы должны называть свои переменные строчными (верблюжий регистр, на самом деле). Итак, listA и deepCopyofListA.

0 голосов
/ 10 апреля 2020

Начиная с , если вы хотите удалить определенный элемент из внутреннего списка, вы должны сначала выполнить итерацию внешнего элемента, а затем использовать List::removeIf на внутренний:

// 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());

Для более низких версий, чем 8, вы должны использовать правильный способ удаления, используя Iterator:

for (final List<String> innerList: outerList) {
    Iterator<String> iterator = innerList.iterator();
    while (iterator.hasNext()) {
        if ("cucumber".equals(item)) {
            iterator .remove();
        }
    }
}

В любом случае используйте "cucumber".equals(item), а не item.equals("cucumber"), потому что первый не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...