我有这个代码
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");
}
}
}