Java ListMultimap-三个级别

问题描述 投票:0回答:1

具有与以下类似的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);
    }
}
java guava
1个回答
0
投票

根据安迪·特纳(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
        ));
© www.soinside.com 2019 - 2024. All rights reserved.