для вашей данной структуры данных;
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();