列表列表列表到扁平列表映射的映射

Posted

技术标签:

【中文标题】列表列表列表到扁平列表映射的映射【英文标题】:List of lists of lists to a map of flatten map of lists 【发布时间】:2021-05-20 18:26:37 【问题描述】:

我有一个列表(州)列表(城市)列表(城镇)。如何展平中间列表(城市)并转换为列表(城镇)的地图(城镇名称)的地图(州名)?

这个问题可能与另一个问题Java 3 level nested list to 3 level nested map 相似,但它们并不相同。这个,我需要把其中一个列表弄平。

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Data
@AllArgsConstructor
class Country 
    private String name;
    private List<State> states;


@Data
@AllArgsConstructor
class State 
    private String name;
    private List<City> cities;


@Data
@AllArgsConstructor
class City 
    private String name;
    private List<Town> towns;


@Data
@AllArgsConstructor
class Town 
    private String name;
    private String address;
    private Integer population;


public static void main(String[]args) 
    List<Town> countryAStateACityATownsList = new ArrayList();
    countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownA", "addressOfCountryA-StateA-CityA-TownA", 100));
    countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownB", "addressOfCountryA-StateA-CityA-TownB", 100));
    countryAStateACityATownsList.add(new Town("CountryA-StateA-CityA-TownC", "addressOfCountryA-StateA-CityA-TownC", 100));

    List<Town> countryAStateACityBTownsList = new ArrayList();
    countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownA", "addressOfCountryA-StateA-CityB-TownA", 100));
    countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownB", "addressOfCountryA-StateA-CityB-TownB", 100));
    countryAStateACityBTownsList.add(new Town("CountryA-StateA-CityB-TownC", "addressOfCountryA-StateA-CityB-TownC", 100));

    List<Town> countryAStateACityCTownsList = new ArrayList();
    countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownA", "addressOfCountryA-StateA-CityC-TownA", 100));
    countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownB", "addressOfCountryA-StateA-CityC-TownB", 100));
    countryAStateACityCTownsList.add(new Town("CountryA-StateA-CityC-TownC", "addressOfCountryA-StateA-CityC-TownC", 100));

    City cityA = new City("cityA", countryAStateACityATownsList);
    City cityB = new City("cityB", countryAStateACityBTownsList);
    City cityC = new City("cityC", countryAStateACityCTownsList);

    List<City> countryAStateACitiesList = new ArrayList<>();
    countryAStateACitiesList.add(cityA);
    countryAStateACitiesList.add(cityB);
    countryAStateACitiesList.add(cityC);

        State stateA = new State("stateA",countryAStateACitiesList);

        Country countryA = new Country("countryA", Collections.singletonList(stateA));
   
    


我想要一张城镇地图。 (所以城市列表是扁平的): state.name -> town.name -> 城镇。 我想做像destinationMap.get("stateA").get("CountryA-StateA-CityA-TownA") 这样的事情,这会给我一个名为“CountryA-StateA-CityA-TownA”的城镇实例。

请帮忙,我一直在尝试通过使用流来完成此任务,但目前无法做到。

我试过这个:

        countryA.getStates()
               .stream()
               .collect(Collectors.toMap(State::getName,
                        st-> st.getCities()
                               .stream()
                               .collect(Collectors.toMap(City::getName,
                                                         City::getTowns))));

这会创建一个 state.name 到 city.name 到 towns 的映射。但这不是我想要的。

我想要一张 state.name 到 town.name 到同名城镇的地图。

【问题讨论】:

我建议添加一个简短的数据样本,也许使用List.of @BasilBourque Bourque 提供的代码中有数据示例。 countryA.getStates 具有嵌套列表。请帮忙。将不胜感激。 如果此答案对您有用,请在答案旁边的复选标记上将其标记为已接受,谢谢! 【参考方案1】:

我喜欢 Java 的功能部分,这就是我所做的,似乎可以按照您想要检索城镇的方式工作。

Map<String, Map<String, Town>> map =
  countryA.getStates()
    .stream()
    .collect(Collectors.toMap(State::getName,
      st -> st.getCities()
        .stream()
        .map(City::getTowns)
        .flatMap(List::stream)
        .collect(Collectors.toMap(Town::getName, Function.identity()))));
System.out.println(map.get("stateA").get("CountryA-StateA-CityA-TownA"));

给出输出

Townname='CountryA-StateA-CityA-TownA', address='addressOfCountryA-StateA-CityA-TownA', population=100

请注意,您的示例中有重复项,我认为不同城市中的城镇不应重复。如果这是您想要的,请告诉我!

【讨论】:

以上是关于列表列表列表到扁平列表映射的映射的主要内容,如果未能解决你的问题,请参考以下文章

2021年大数据常用语言Scala(二十三):函数式编程 扁平化映射 flatMap

扁平化列表列表[重复]

扁平化列表列表,用特定值替换空子列表

2021-11-08:扁平化嵌套列表迭代器。给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化

为啥扁平列表中的空白项目

LeetCode 341 扁平化嵌套列表迭代器