Как сгруппировать список строковых массивов, Java 8 или Java 11 - PullRequest
0 голосов
/ 25 февраля 2019

{username, order} пытается сгруппировать их по имени пользователя.

List<String[]> orders = new ArrayList<>();
            String[] o1 = {"john, apple"};
            String[] o2 = {"john, Orange"};
            String[] o3 = {"jane , banana"};
            String[] o4 = {"jane, Orange"};
            orders.add(o1);
            orders.add(o2);
            orders.add(o3);
            orders.add(o4);

скажем, если у меня есть следующие заказы, и я хочу добраться до этого

List<List<String[]>> groupedOrders = new ArrayList<>();
    groupedOrders.add(Arrays.asList(o1,o2));
    groupedOrders.add(Arrays.asList(o3,o4));

, поэтомуРезультат, который я ищу, это groupedOrders, как и вышеупомянутый или на карте, если список заказов сгруппирован вместе. Как мне преобразовать список заказов выше в groupOrders, я пытался использовать карту или потоки, но не мог сделатьэто работает.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Обратите внимание, что ваш массив String[] o1 = {"john, apple"}; имеет только 1 элемент, и вы, вероятно, хотите что-то вроде {"john", "apple"}.Обратите внимание на кавычки.

Я бы также порекомендовал решение @ Lino's , но это можно сделать с массивами:

Map<String, List<String[]>> map = orders.stream()
            .collect(Collectors.groupingBy(s -> s[0]));
0 голосов
/ 25 февраля 2019

Я бы рекомендовал не использовать массивы, используя пользовательский класс:

class Order {
    String username;
    String order;
}

Я опустил геттеры, сеттеры, модификаторы и конструкторы, так как эти 2 поля являются основным компонентом этого класса.

После этого у вас может быть List<Order> orders, куда вы добавляете все заказы, оттуда довольно просто сгруппировать их по имени:

Map<String, List<Order>> grouped = orders.stream()
    .collect(Collectors.groupingBy(Order::getUsername));

Если вам нужны только реальные заказы, напримерbanana, apple и т. Д. Вы можете использовать это:

Map<String, List<String>> grouped = orders.stream()
    .collect(Collectors.groupingBy(
        Order::getUsername, 
        Collectors.mapping(Order::getOrder, Collectors.toList())
    ));

Если вы действительно хотите использовать массивы в качестве входных данных, вы также можете использовать это:

Map<String, List<String>> grouped = Arrays.stream(orders)
    .collect(Collectors.groupingBy(
        a -> a[0], 
        Collectors.mapping(a -> a[1], Collectors.toList())
    ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...