Как получить все строки из ArrayList <ArrayList <String>>, имеющие конкретное значение в конкретном столбце? - PullRequest
0 голосов
/ 06 ноября 2018
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Delete
{
    public static void main(String[] args)
    {
         List<List<String>> list = new ArrayList<>();
         list.add(List.of("A","B","C","R"));
         list.add(List.of("E","F","G","F"));
         list.add(List.of("A","B","C","D"));
    }
}

Я хочу получить все строки, которые имеют "A" в первом столбце. В приведенном выше примере list результаты должны содержать только 1-ю и 3-ю строки:

["A", "B", "C", "R"]
["A", "B", "C", "D"]

Я бы предпочел решение, которое использует Java 8 stream.

Мой другой вопрос, Как найти уникальное значение столбца 2D ArrayList в Java? , может предоставить некоторый дополнительный контекст.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете просто использовать следующее:

List<List<String>> rows = list.stream()
                              .filter(l -> l.get(0).contains("A"))
                              .collect(Collectors.toList());

Здесь мы проверяем, содержит ли первый индекс списка «A», а затем результирующий поток собирается в список.

Вывод на печать List<List<String>> rows

rows.forEach(System.out::println);

[A, B, C, R]

[A, B, C, D]

0 голосов
/ 06 ноября 2018

Если я правильно понимаю ваши требования, вам не нужен поток. Метод List.removeIf немного упущен и весьма полезен:

     list.removeIf(inner -> inner.size() <= 0 || ! inner.get(0).equals("A"));

Для другого индекса, скажем, 3, вам нужно заменить оба вхождения 0 на 3. Возможно, вы захотите обернуть все это в метод. Обратите внимание, что это изменяет исходный список. Давайте дамп измененного списка, чтобы увидеть результат:

     list.forEach(System.out::println);

Это печатает:

[A, B, C, R]
[A, B, C, D]

Если вы хотите получить результат в новом списке, вы можете либо использовать поток, либо просто скопировать список с помощью конструктора ArrayList(Collection), а затем использовать приведенное выше для копии.

...