Java: объединить два com.google.common.collect.Table - PullRequest
1 голос
/ 19 сентября 2019

У меня есть два Table с:

Table<Long,String,Integer> tableOne
Table<Long,String,Integer> tableTwo

Как объединить две таблицы, в которых значения суммируются (если необходимо)?

Так что в результате я быполучить

Table<Long,String,Integer> sumTable 

Например, у меня есть следующие значения:

в tableOne:

   1L Fruits     20
   2L Fruits     30
   2L Vegetables 15
   3L Vegetables 10

в tableTwo

   2L Fruits     10
   2L Vegetables 40
   3L Fruits     15
   4L Vegetables 35

, поэтомусумма была бы:

   1L Fruits     20
   2L Fruits     30 + 10 = 40
   2L Vegetables 15 + 40 = 55
   3L Vegetables 10
   3L Fruits     15
   4L Vegetables 35

Я был бы признателен за потоковое решение Java8, но было бы приемлемо и классическое.

1 Ответ

4 голосов
/ 19 сентября 2019

Вы можете использовать Tables.toTable :

Table<Long, String, Integer> tableOne = HashBasedTable.create();
tableOne.put(1L, "Fruits", 20);
tableOne.put(2L, "Fruits", 30);
tableOne.put(2L, "Vegetables", 15);
tableOne.put(3L, "Vegetables", 10);

Table<Long, String, Integer> tableTwo = HashBasedTable.create();
tableTwo.put(2L, "Fruits", 10);
tableTwo.put(2L, "Vegetables", 40);
tableTwo.put(3L, "Fruits", 15);
tableTwo.put(4L, "Vegetables", 35);


HashBasedTable<Long, String, Integer> sumTable = Stream.concat(tableOne.cellSet().stream(), tableTwo.cellSet().stream())
        .collect(Tables.toTable(Table.Cell::getRowKey,
                Table.Cell::getColumnKey,
                Table.Cell::getValue,
                Integer::sum, HashBasedTable::create));

sumTable.cellSet().forEach(System.out::println);

Выход

(1,Fruits)=20
(2,Fruits)=40
(2,Vegetables)=55
(3,Vegetables)=10
(3,Fruits)=15
(4,Vegetables)=35
...