地图内的地图 - 需要特定格式的数据

时间:2018-02-05 07:20:21

标签: java hashmap

我有一个要求,我想读取多个项目pom文件并以下面的格式显示数据

  {
 "java" : {"1.7" : ["project1"],"1.8": ["project2"]},
 "junit" : {"4.12" : ["project1"]},
 "hsqldb" : {"1.8" : ["project3"],"1.1": ["project6"]}
   }

我的编码是关于项目,ver和technlogy以及显示的输入,但是我无法在内部进行第二次评估

private void addTechnologyData(String projName,String techName,String ver)
{
    String keyFormat=techName;
    if (technologyMap.containsKey(keyFormat)) {
        Map preValue=technologyMap.get(keyFormat);
        if(!preValue.containsValue(projName)) {
            Map<String,String> temp = new HashMap();
            temp=preValue;
            temp.put(ver,projName);
            technologyMap.put(keyFormat, temp);
        }
    } else {
       Map<String,String> projectVersiomap = new HashMap();
       projectVersiomap.put(ver,projName);
       technologyMap.put(keyFormat, projectVersiomap);
    }
}

请帮助我理解为什么我无法将第二个键值对添加到内部地图? 有没有比我做的更好的方式?

1 个答案:

答案 0 :(得分:0)

如果我的理解是正确的,那么您希望每个版本有多个项目(因为您有一个数组),因此您的concatMap(Observable::fromIterable)阻止了这一点,每个键只能有一个值。您可以使用Map List,但我建议您使用一些POJO来保持代码清洁。

创建一个Map<String,Map<String, List<String>>>类,其中包含Technology中每个版本的Project列表。这看起来像是:

Map

这里,逻辑在POJO中。您只需使用public class Technology{ private String name; private Map<String, List<Project>> projects; public Technology(String name){ this.name = name; this.projects = new HashMap<>(); } public void addProjectToVersion(String version, Project project){ List<Project> l = this.projects.get(version); if(l == null){ //doesn't exist l = new ArrayList<>(); this.projects.put(version, l); } l.add(project); } } 来保存您的实例,Collection如果您愿意,或Map(实施Listequals即可轻松恢复实例)。你可以使用它:

hashCode

这将正确输入:

  

{junit = {4.12 = [project1]},java = {1.7 = [project1,project2],1.8 = [project1]}}

请注意,我重复使用了您的逻辑,根据要求,让private Map<String, Technology> techs = new HashMap<>(); .... public void addProject(String tech, String version, String projectName){ Technology t = techs.get(tech); if(t == null){ //doesn't exist t = new Technology(tech); techs.put(tech, t); } t.addProjectToVersion(version, new Project(projectName)); } public void insertData(){ addProject("java", "1.7", "project1"); addProject("java", "1.7", "project2"); addProject("java", "1.8", "project1"); addProject("junit", "4.12", "project1"); System.out.println(techs); } 每个List<Project>与版本保持一致可能会更好。但这是基于背景。