Как найти уникальное значение столбца 2D ArrayList в Java? - PullRequest
0 голосов
/ 04 ноября 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"));
         System.out.println(list.stream().distinct().count());
         Map<String, Long> countMapOfColumn = list.stream()
                                                  .filter(innerList -> innerList.size() >= 3)
                                                  .map(innerList -> innerList.get(3 - 1))
                         .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        System.out.println(countMapOfColumn.keySet());
    }
}

Я хочу выяснить уникальный элемент столбца 3: "C","G", а в столбце 3. 2 уникальный элемент.

Это можно сделать с помощью loop, но я не могу использовать цикл. Использование java stream может быть решением.

Кроме того, как я могу получить количество строк, имеющих "A","B" в столбце 1,2 за один раз и в целом для N столбцов?

Ответы [ 2 ]

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

Ваш вопрос не компилируется. Предполагая, что вы определили список следующим образом, вы можете легко найти отличительное значение в столбце 3, используя следующее. Здесь мы просто отображаем 3-й столбец (с помощью индекса 2) и затем применяем .distinct() к результирующему потоку.

List<List<String>> list = Arrays.asList(Arrays.asList("A", "B", "C"), 
                                        Arrays.asList("E", "F", "G"),
                                        Arrays.asList("A", "B", "C"));

List<String> distinct = list.stream().map(a -> a.get(2))
                            .distinct().collect(Collectors.toList());

Когда вы распечатываете элементы, они будут выводить:

C

G

Вы можете использовать ту же логику, чтобы найти счетчик 'C' в столбце 3, используя ту же логику.

list.stream().map(a -> a.get(2)).filter(i -> i.contains("C")).count();
0 голосов
/ 04 ноября 2018

для вашей данной структуры данных;

Map<String, Long> countMapOfColumn = list.stream()
        .filter(innerList -> innerList.size() >= column)
        .map(innerList -> innerList.get(column - 1))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

, где column = 3, вы получите карту с {"C", "G"} в качестве набора ключей, а значения - количество каждого символа в данном столбце. Он также будет работать для неоднородных матриц, поскольку он будет пропускать строки без n-го столбца.

Уникальный счет любого столбца будет размером результирующей карты метода сбора; countMapOfColumn.size()

Чтобы получить индивидуальное количество символов, используйте полученную карту с ключами в качестве ввода, например, чтобы получить счет C в column = 3, используйте countMapOfColumn.get("C"), который вернет 2

Но я бы предпочел использовать Table в Guava, вы можете напрямую выбирать любую строку или столбец без каких-либо хлопот, тогда это только получение n-го столбца и фильтрация наших дубликатов.

обновление

Чтобы получить количество строк, начинающихся с последовательного списка list = {"A", "B"};

List<String> startingList = Arrays.asList("A", "B");
Long count = list.stream()
        .filter(innerList -> innerList.size() >= startingList.size() 
                && innerList.subList(0, startingList.size()).equals(startingList))
        .count();
...