构建计数的位置层次结构

时间:2016-11-02 05:18:44

标签: java java-8

我有以下位置层次结构:

public class Location {
   public Location parentLocation;
   public String name;
   public int id;
}

List<Location> listOfCities; // This list strictly contains all "city" level locations like Chicago, Atlanta etc.

让我们假设parentLocation只能是一个国家,而一个国家的parentLocation是null。即。如果我有芝加哥的位置,芝加哥位置对象的parentLocation将是USA,并且链将终止于那里,因为USA位置parentLocation = null。我有一个城市级别的位置对象列表,我想得到以下计数:

USA (20)
  - Chicago (12)
  - New York (1)
  - Oregon (5)
  - Atlanta (2)
Mexico (1)
  - Puebla (1)

在Java8中是否有一种方便的方法来获取一个jsonable对象,该对象代表我在上面给出的城市位置列表中描述的计数层次结构?我的尝试:

// Get counts of all cities in listOfCities (ie. Chicago -> 12)
Map<String, Integer> cityCounts = listOfCities.stream()
.map(Location::name)
.collect(Collectors.toMap(city -> city, city -> 1, Integer::sum));

我不确定如何通过parentLocation获取“累计”计数,并将所有内容整合到一个干净的响应对象中,该对象可以像上面的相同方式一样走过。

1 个答案:

答案 0 :(得分:4)

您可以制作Map<String, Map<String, Long>>,在外部地图中使用国家/地区名称,在内部地图中使用城市名称/计数。

import static java.util.stream.Collectors.*;

Map<String,Map<String,Long>> cityCountsByCountry = listOfCities
    .stream()
    .collect(groupingBy(city -> city.parentLocation.name,
                 groupingBy(city -> city.name,
                     counting())));

这会产生类似于这个JSON的结构:

{
  "USA": {
    "Chicago": 12,
    "New York": 1,
    "Oregon": 5,
    "Atlanta": 2
  },
  "Mexico": {
    "Puebla": 1
  }
}