我有一个要求,我想读取多个项目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);
}
}
请帮助我理解为什么我无法将第二个键值对添加到内部地图? 有没有比我做的更好的方式?
答案 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
(实施List
和equals
即可轻松恢复实例)。你可以使用它:
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>
与版本保持一致可能会更好。但这是基于背景。