hashmap java的漂亮打印表格式

时间:2020-10-26 14:23:30

标签: java java-8 hashmap pretty-print

假设我们有一个键和值的HashMap,其中键是Integers,值是Lists,然后我用hashMap构造一个treeMap,以使其顺序排列:

Map<Integer, List<Boolean>> map = new HashMap<>();
Map<Integer, List<Boolean>> orderedMap = new TreeMap<>(map);

如果我愿意

map.entrySet().forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue())

它在每一行之后吐出每个键及其值。这是我要追求的目标,但我认为可能更容易打印出某些行x列。可能在移至下一个之前,每行打印10个key:值,或者最好在第一列中依次打印出10个key:值,然后下一列打印下10个,依此类推,直到到达末尾为止(最后一栏不一定是10),但是我不知道如何达到这个目标

想要的示例输出:

entry1  entry11 ...
entry2  entry12
entry3  entry13
entry4  entry14
entry5  entry15
entry6  .
entry7  .
...     .
entry10 entry20

3 个答案:

答案 0 :(得分:0)

您可能想使用两个嵌套循环(一个用于行,一个用于列)和Iterator<Entry<Integer, List<Boolean>>>来进行类似的操作,只要您无法从基于其索引的映射中获取条目,就像使用List

// define the row size and the Iterator
int rows = 10; 
Iterator<Map.Entry<Integer, List<Boolean>>> iterator = map.entrySet().iterator();

for (int i=0; i<rows; i++) {                                           // for each row
    for (int j = 0; j < map.size(); j += rows) {                       // .. for each column
        if (iterator.hasNext()) {                                      // .. if there is a next value 
            Map.Entry<Integer, List<Boolean>> entry = iterator.next(); // .... get it
            System.out.print(entry);                                   // .... print the line
        } else break;                                                  // .... or else break the loop
        System.out.print(" \t");                                       // .. and print the tabulator
    }
    System.out.println();                                              // move to the next line (row)
}

注意printprintln的使用位置。这是38个条目的示例输出:

0=[false, true]     1=[true, false]     2=[false, true]     3=[true, false]     
4=[false, true]     5=[true, false]     6=[false, true]     7=[true, false]     
8=[false, true]     9=[true, false]     10=[false, true]    11=[true, false]    
12=[false, true]    13=[true, false]    14=[false, true]    15=[true, false]    
16=[false, true]    17=[true, false]    18=[false, true]    19=[true, false]    
20=[false, true]    21=[true, false]    22=[false, true]    23=[true, false]    
24=[false, true]    25=[true, false]    26=[false, true]    27=[true, false]    
28=[false, true]    29=[true, false]    30=[false, true]    31=[true, false]    
32=[false, true]    33=[true, false]    34=[false, true]    35=[true, false]    
36=[false, true]    37=[true, false]    

免责声明:该代码要求进行很多改进,即在出现不规则的输出长度时调整制表符等。

答案 1 :(得分:0)

如果您仅出于调试/记录的目的,那么这是一个简单的方法,它按列而不是按行打印条目,并且不会多次重复映射。

maxCols是打印时要具有的列数。

    public static void main(String[] args) {
        Map<Integer, List<Boolean>> map = new HashMap<>();

        map.put(1, Arrays.asList(true, false, false));
        map.put(2, Arrays.asList(false, false, false));
        map.put(3, Arrays.asList(true, true, false));
        map.put(4, Arrays.asList(true, false, true));
        map.put(5, Arrays.asList(false, true, true));
        map.put(6, Arrays.asList(true, false, false));
        map.put(7, Arrays.asList(false, false, false));
        map.put(8, Arrays.asList(true, true, false));
        map.put(9, Arrays.asList(true, false, true));
        map.put(10, Arrays.asList(false, true, true));

        int counter = 1;
        int maxCols = 5;
        for (Map.Entry<Integer, List<Boolean>> entry : map.entrySet()) {
            System.out.printf("%s ", entry);
            counter++;

            if (counter == maxCols) {
                System.out.println();
                counter = 1;
            }
        }
    }

答案 2 :(得分:-1)

我会将条目视为一个列表,并通过两个常规循环遍历它。这是一个伪代码:

List<HashMap.Entry> entries = ...;
for (int i = 0; i < entries.size()/10; i++) {
  for (int j = i; j < entries.size(); j+=10) {
    HashMap.Entry entry = map.getEntry(j);
    System.out.print(entry + '\t');
  }
  System.out.println();
}

或者,您可以创建一个包含10行的StringBuffer数组,并在遍历时将输出附加到正确的行。然后打印所有行。在打印之前将输出存储在2D数组中也是一种有效的选择,并且如果要确保一列中的所有条目都具有适当数量的尾巴空格/制表符,这可能是最好的选择。