在泛化循环以在表中显示数据(如在控制台上)后计算两个值之间的差异



我有这个代码

Map<String, Map<String, List<Integer>>> entries = new HashMap<>();
List<String> innerMapKeys = new ArrayList<>();
innerMapKeys.add("key1");
innerMapKeys.add("key2");
System.out.println(StringUtils.repeat("-", 38 * innerMapKeys.size()));
System.out.printf("|%10s|","");
for (String source : innerMapKeys) {
    System.out.printf("%30s|", StringUtils.center(source,31));
}
System.out.println();
System.out.println(StringUtils.repeat("-", 38 * innerMapKeys.size()));
System.out.printf("|%10s|%15s|%15s|%15s|%15s|%10s|%10s|n", "", "Sum", "Count", "Sum", "Count", "Diff Sum", "Diff Count");
System.out.println(StringUtils.repeat("-", 38 * innerMapKeys.size()));
for (Map.Entry<String,Map<String,List<Integer>>> entry : entries.entrySet()) {
    System.out.printf("%15", entry.getKey());
    for (int i = 0; i < innerMapKeys.size(); i++) {
        if (i < innerMapKeys.size() - 1) {
            if(entry.getValue().contains(innerMapKeys.get(i))){
                List<Integer> values = entry.getValue().get(innerMapKeys.get(i));
                for (int j = 0; j < values.size(); j++) {
                    System.out.printf("|%10d", values.get(j));
                }
            }
            else { 
                System.out.printf("|%20s", "MISSING"); 
            }
        }
        else {
            if(entry.getValue().contains(innerMapKeys.get(i))){
                List<Integer> values = entry.getValue().get(innerMapKeys.get(i));
                for (int j = 0; j < values.size(); j++) {
                    System.out.printf("|%10d", values.get(j));
                }
                System.out.println("|");
            }
            else { 
                System.out.printf("|%20s|n", "MISSING"); 
            }
        }
    }
}
System.out.println(StringUtils.repeat("-", 38 * innerMapKeys.size()));

给出此输出

--------------------------------------------------------------------------------------------------
|          |    Data Source 1              |   Data Source 2               |          |          |
--------------------------------------------------------------------------------------------------
|          |            Sum|          Count|            Sum|          Count|  Diff Sum|Diff Count|
--------------------------------------------------------------------------------------------------
|      Key1|            479|            595|            479|            595|          |          |
|      Key2|            383|         13,452|            383|            452|          |          |
|      Key3|          7,969|         11,912|          7,969|          1,912|          |          |
|      Key4|         77,262|          3,478|         77,262|          3,478|          |          |
|      Key5|          2,333|          6,254|          2,333|          6,254|          |          |
|      Key6|            610|         89,636|            610|         89,636|          |          |
|      Key7|            541|         37,090|            541|         37,090|          |          |
|      Key8|            994|         80,472|            994|         80,472|          |          |
|      Key9|         14,214|          5,078|         14,214|          5,078|          |          |
|     Key10|            587|         64,840|            587|         64,840|          |          |
|     Key11|            153|         61,769|            643|         61,730|          |          |
|     Key12|            400|          5,635|            400|          5,635|          |          |
--------------------------------------------------------------------------------------------------

我想填写Diff Sum列和Diff Count列,其中Sum列和Count列之间分别存在差异。

最初,我的for循环看起来像

for (Map.Entry<String,Map<String,List<Integer>>> entry : entries.entrySet()) {
    System.out.printf("%15", entry.getKey());
    if(entry.getValue().contains("key1")){
        List<Integer> values = entry.getValue().get("key1");
        System.out.printf("%10d%10d", values.get(0), values.get(1));
    }else { 
        System.out.printf("%20s", "MISSING"); 
    }
    if (entry.getValue().containsKey("key2")) { 
        List<Integer> values = entry.getValue().get("key2"); 
        System.out.printf("%10d%10d", values.get(0), values.get(1)); 
    } else { 
        System.out.printf("%20dn", "MISSING"); 
    }
    if(entry.getValue().contains("key1") && entry.getValue().contains("key2")){
        System.out.printf("%10d%10dn", Math.abs(entry.getValue().get("key1").get(0) - entry.getValue().get("key2").get(0)),
                            Math.abs(entry.getValue().get("key1").get(1) - entry.getValue().get("key2").get(1)));
    }
}

这也在填写上面提到的列。在我概括之后,我找不到填充这些列的方法。关于我该怎么做的任何建议?

谢谢

几天我找到了一种方法,自我如何做到这一点。通过添加另一个for循环,在该内部循环之后,我设法获得了我想要的结果。我仍然希望找到一种方法来优化整个循环。无论如何,我的循环变成了这个:

for (Map.Entry<String,Map<String,List<Integer>>> entry : entries.entrySet()) {
    System.out.printf("%15", entry.getKey());
    for (int i = 0; i < innerMapKeys.size(); i++) {
        if (i < innerMapKeys.size() - 1) {
            if(entry.getValue().contains(innerMapKeys.get(i))){
                List<Integer> values = entry.getValue().get(innerMapKeys.get(i));
                for (int j = 0; j < values.size(); j++) {
                    System.out.printf("|%10d", values.get(j));
                }
            }
            else { 
                System.out.printf("|%20s", "MISSING"); 
            }
        }
        else {
            if(entry.getValue().contains(innerMapKeys.get(i))){
                List<Integer> values = entry.getValue().get(innerMapKeys.get(i));
                for (int j = 0; j < values.size(); j++) {
                    System.out.printf("|%10d", values.get(j));
                }
                System.out.println("|");
            }
            else { 
                System.out.printf("|%20s", "MISSING"); 
            }
        }
    }
    for(int i = 0; i < keys.size()-1;++i){ // keys is a set of String that contains all the keys of my outer map
        if(entry.getValue().contains(innerMapKeys.get(i))){
            List<Integer> values = entry.getValue().get(innerMapKeys.get(i));

            System.out.printf("%10d%10dn",
                Math.abs(entry.getValue().get(i).get(0) - entry.getValue().get(i+1).get(0)),
                Math.abs(entry.getValue().get(i).get(1) - entry.getValue().get(i+1).get(1)))
        }
        else { 
            System.out.printf("|%20s|n", "MISSING"); 
        }
    }
}

最新更新