假设我们有一个键和值的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
答案 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)
}
注意print
和println
的使用位置。这是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数组中也是一种有效的选择,并且如果要确保一列中的所有条目都具有适当数量的尾巴空格/制表符,这可能是最好的选择。