具有与以下类似的SQL查询:
SELECT DISTINCT REGION, COUNTRY, CITY
有没有一种方法可以使用Google的ListMultimap,以便最终得到键->值->值结构?
例如
{EUROPE{GERMANY{BERLIN, DORTMUND, HANNOVER}, FRANCE{PARIS, LYON, NICE}}}
或者其他软件包更适合于此吗?
编辑:
尝试实现@Prog_G的解决方案,但是使用以下方法却无法使用。我认为我必须在最后将外部转换为另一个数据结构。我会以此方式创建地图吗?PS。真正的示例更深一层,但出于问题的考虑,希望使其更简单。
private static class GeoRowMapper implements RowCallbackHandler {
ListMultimap<String, ListMultimap<String, ListMultimap<String, String>>> outer = ArrayListMultimap.create();
ListMultimap<String, ListMultimap<String, String>> middle = ArrayListMultimap.create();
ListMultimap<String, String> inner = ArrayListMultimap.create();
@Override
public void processRow(ResultSet rs) throws SQLException {
String region = rs.getString("region");
String country = rs.getString("country");
String city = rs.getString("city");
String address = rs.getString("address");
inner.put(city, address);
middle.put(country, inner);
outer.put(region, middle);
}
public ListMultimap<String, ListMultimap<String, ListMultimap<String, List<String>>>> get() {
return Multimaps.asMap(outer);
}
}
根据安迪·特纳(Andy Turner)的评论,您可以使用Table
。在您的情况下,它将类似于:
ImmutableTable<Region, Country, ImmutableList<City>> immutableTable = RECORDS.stream()
.collect(toImmutableTable(
r -> r.getRegion(),
r -> r.getCountry(),
r -> ImmutableList.of(r.getCity()),
(l, l2) -> ImmutableList.<City>builder().addAll(l).addAll(l2).build()
));
或者如果您想要可变表作为结果:
Table<Region, Country, List<City>> table = RECORDS.stream()
.collect(toTable(
r -> r.getRegion(),
r -> r.getCountry(),
r -> Lists.newArrayList(r.getCity()),
(l, l2) -> {
l.addAll(l2);
return l;
},
HashBasedTable::create
));