gpt4 book ai didi

java - 如何从平面 SQL 选择结果集创建嵌套映射

转载 作者:行者123 更新时间:2023-12-02 01:12:33 26 4
gpt4 key购买 nike

有类似于以下的 SQL 查询:

SELECT DISTINCT REGION, COUNTRY, CITY

产生此结果集

REGION COUNTRY CITYEUROPE FRANCE  PARISEUROPE FRANCE  LYON EUROPE FRANCE  NICEEUROPE GERMANY BERLINEUROPE GERMANY DORTMUND EUROPE GERMANY HANNOVER

Is there a way to use google's ListMultimap so that I end up with a key -> value -> value structure?

E.g.

{EUROPE
{GERMANY
{BERLIN, DORTMUND, HANNOVER},
FRANCE
{PARIS, LYON, NICE}
}
}

或者另一个包更适合这个?

编辑:

尝试实现@Prog_G的解决方案,但使用以下方法导致内存不足。我认为最后我必须将外部转换为另一个数据结构。我会以某种方式创建一个 map 吗?附言。真实的例子更深一层,但为了问题的目的想让它更简单。

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);
}
}

最佳答案

stream()Collectors.groupingBy 配合使用(来源 here ,另请参阅 this )。 Set 而不是 List 保证了元素的唯一性。

Map<String, Map<String, Set<String>>> grouped = 
records.stream()
.collect(Collectors.groupingBy(r -> r.region,
Collectors.groupingBy(r -> r.country,
Collectors.mapping(r -> r.city, Collectors.toSet()))));

给定

class Record {
String city;
String region;
String country;
}

目前,这实际上会给您 HashMap 和一个 HashSet。他们的问题是在迭代条目时缺乏顺序保证。如果结构应支持用户界面中显示的树,则您也无法进行重新排序或“在索引处插入”操作。例如。 LinkedHashMapTreeSet具有可预测的迭代顺序。不过,在创建最终的树数据结构时,这种方法可能可以作为中间步骤。

根据您的喜好,可以选择使用 Map.computeIfAbsent,该选项是在 an eye on multimaps 中引入的。 .

public Map<String, Map<String, Set<String>>> mumap(List<Record> records) {
Map<String, Map<String, Set<String>>> result = new LinkedHashMap<>();
for (Record r : records) {
result.computeIfAbsent(r.region, region -> new LinkedHashMap<>())
.computeIfAbsent(r.country, country -> new TreeSet<>())
.add(r.city);
}
return result;
}

关于java - 如何从平面 SQL 选择结果集创建嵌套映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59151885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com