首页 > 解决方案 > 复杂的打印声明

问题描述

到目前为止我有什么:

一个有两个文件夹的目录:

  1. ..\数据\BeforeModern

  2. ..\数据\AfterModern

每个文件夹(BeforeModern 和 AfterModern)有 4 个 JSON 文件(AU、UK、US、IND);

Json文件包含我感兴趣的特定字段名(语言)。

例如在 BeforeModern 的 AU JSON 中,lan​​g 是

Language["English","Spanish"]

而在 AFterModern 中,lan​​g 是这样的:

Language["English","Spanish","Arabic"]

我想打印如下结果:

         **BeforeModern**            **AfterModern**
            English                     English
AU :        Spanish                     Spanish
                                        Urdu

到目前为止我的方法:

for (File beforeFile: new File(locationPath).listFiles()) {
            File afterFile= new File(locationPath.replace("BeforeModern", "AfterModern") + "\\" + locFile.getName());

            if (afterfile.exists()) {
                ObjectMapper mapper = new ObjectMapper();
                JsonNode tree1 = mapper.readTree(beforeFile); //Parse Specific JSON from BeforeModern Location
                JsonNode tree2 = mapper.readTree(afterFile); //Parse Specific JSON from AfterModern Location
                if (tree1.has("Language") && tree2.has("Language")) {
                    JsonNode sup_loc = tree1.get("Language");
                    List<String> list1 = new ArrayList<>();
                    sup_loc.forEach(l -> list1.add(l.asText()));
                    JsonNode sup_rent = tree2.get("Language");
                    List<String> list2 = new ArrayList<>();
                    sup_rent.forEach(l -> list2.add(l.asText()));
                    int rows = Math.max(list1.size(), list2.size());


                    Map<String, String> hash= new HashMap<>();
                    for (int i=0;i<rows;i++){
                        hash.put(list1.get(i),list2.get(i));
                    }
                    Map<String,Map<String,String>> map = new HashMap<>();
                    map.put(beforeFile.getName(),hash);
                    map.entrySet().forEach((k)->System.out.println(k.getKey()+"                                                "+k.getValue()));
                    //hash.entrySet().forEach((k)->System.out.println(k.getKey()+"                         "+k.getValue()));
                    System.out.println("________________________________________________________________________________");

标签: jsonjava-8jackson

解决方案


为了打印AU :语言列表的中间行,您需要计算中间行的索引。

为了将两个语言名称列表打印为列,您需要在第一列中找到最长的语言名称的长度,其列标题为**BeforeModern**。然后你可以使用printf()类的方法PrintStream来确保**AfterModern**列表也显示为一列。在下面的代码片段中,longestaint表示最长语言名称的长度,并且beforeaString在第一列中包含语言名称,并且在第二列afterString表示相应的语言名称。

System.out.printf("%-" + longest + "s  %s%n", before, after); 

并通过循环打印列表,以便您知道何时打印AU :. 在下面的代码中,maxLinesint两个语言名称列表中较大的一个中的元素数,并且middle是包含需要打印int的行的索引。AU :

for (int i = 0; i < maxLines; i++) {
    if (middle == i) {
        System.out.print("AU : ");
    }
    else {
        System.out.print("     ");
    }
}

推荐阅读