我有以下位置层次结构:
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获取“累计”计数,并将所有内容整合到一个干净的响应对象中,该对象可以像上面的相同方式一样走过。
答案 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
}
}