[英]Need a Fresh pair of Eyes to Work Out the Logic Behind Comparing Values in a Map of Maps
数据格式为:
Map<String, Map<String, Integer>>
看起来像这样:
{"MilkyWay": {"FirstStar" : 3, "SecondStar" : 9 .... }, "Andromeda": {"FirstStar" : 10, "SecondStar" : 9 .... } }
我想在一个快速循环中比较Star
值,所以我想比较MilkyWay
和Andromeda
中FirstStar
的整数值,如果值相同或不同,则返回true
或false
。 由于此地图地图巨大。
我想做这样的事情:
//GalaxyMap<String, <Map<String, Integer>>
for (Map<String, Integer> _starMap : GalaxyMap.values())
{
for (String _starKey : _starMap.keySet()){
//Can't quite think of the correct logic... and I'm tired...
}
}
我想让它尽可能的短。。。我一直在盯着它看一会儿,现在我正和它一起盘旋。
编辑
外键不同,内键相同
而且由于这是服务器的响应,所以我不知道它的大小
为什么这需要成为一张地图。 如果您始终使用“ FirstStar”,“ SecondStar”等作为键,那么为什么不将其作为列表。
Map<String, List<Integer>>
然后,您可以执行以下操作:
public boolean compareGalaxyStar(String galaxyName, String otherGalaxyName, int star) {
List<Integer> galaxyStars = galaxyMap.get(galaxyName);
List<Integer> otherGalaxyStars = galaxyMap.get(otherGalaxyName);
return galaxyStars.get(star) == otherGalaxyStars.get(star);
}
注意 :您需要进行一些验证以确保输入正确。
要为所有星星实施此操作,并没有太大不同。
if(galaxyStars.size() == otherGalaxyStars.size()) {
for(int x = 0; x < galaxyStars.size(); x++) {
// Perform your comparisons.
if(galaxyStars.get(x) != otherGalaxyStars.get(x)) {
// Uh oh, unequal.
return false;
}
}
}
如果内部映射的结构也可能不同,则应执行以下操作:
static boolean allStarValuesEqual(Map<String, Map<String, Integer>> galaxies) {
Map<String, Integer> refStars = null;
for (Map<String, Integer> galaxy : galaxies.values()) {
if (refStars == null) {
refStars = galaxy;
} else {
for (Entry<String, Integer> currentStar : galaxy.entrySet()) {
if (!currentStar.getValue().equals(refStars.get(currentStar.getKey()))) {
return false;
}
}
}
}
return true;
}
请检查以下程序以及输出:
package com.test; import java.util.HashMap; import java.util.Map; import java.util.Set; public class CompareMapValues { private final static String FS = "FirstStar"; private final static String SS = "SecondStar"; private final static String MW = "MilkyWay"; private final static String A = "Andromeda"; public static void main(String[] args) { Map> map = new HashMap>(); Map innerMap1 = new HashMap(); innerMap1.put(FS, 3); innerMap1.put(SS, 9); Map innerMap2 = new HashMap(); innerMap2.put(FS, 10); innerMap2.put(SS, 9); map.put(MW, innerMap1); map.put(A, innerMap2); Set set = map.keySet(); for(String s: set) { Map outerMap = map.get(s); Set set2 = map.keySet(); for(String s2: set2) { Map innerMap = map.get(s2); if(!s2.equals(s)) { Set set3 = outerMap.keySet(); for(String s3: set3) { int i1 = outerMap.get(s3); Set set4 = innerMap.keySet(); for(String s4: set4) { int i2 = innerMap.get(s3); if(s3.equals(s4) && i1==i2) { System.out.println("For parent " + s + " for " + s3 + " value is " + i1); } } } } } } } } //Output: //For parent Andromeda for SecondStar value is 9 //For parent MilkyWay for SecondStar value is 9
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.