这是一个非常通用的问题。我有一个hashmap,我想动态地以表格格式打印它,而不事先知道内容的大小。该表应该像我们在Db查询结果中看到的那样间隔很好。是否有任何库/实用程序可直接帮助进行此类转换?或者JAVA有一些我可以使用的内在函数吗?
我写的代码非常天真,并不能满足字符串的动态长度。我还需要对齐行。
StringWriter returnString = new StringWriter();
Map<String,HashMap<String, String>> hashMap = new HashMap<String, HashMap<String, String>>();
for (Entry e : hashMap.entrySet()) {
HashMap<String, Number> hm = (HashMap<String, Number>) e.getValue();
String key = (String) e.getKey();
returnString.append("|\t").append(key).append("\t|");
for (Entry en : hm.entrySet()){
returnString.append("|\t").append((String) en.getValue()).append("\t|");
}
returnString.append("\r\n");
}
return returnString.toString();
无论字符串长度如何,输出都应该是这样的
s1 | s3 | s4
askdkc | asdkask | jksjndan
答案 0 :(得分:1)
看起来你已经找到了迭代,并且正在处理格式化。你可以把它放到TableModel中,让JTable处理表格格式。
您可以选择固定的列宽或在条目上迭代一次以查找每列的最大长度,然后再次使用适当的填充打印它们。
另一个选择是扩展HashMap,以便在添加条目时记录最长的键和值:
package com.example;
public class MyHashMap<K, V> extends java.util.HashMap<K, V> {
private int maxKeyLength = 0;
private int maxValueLength = 0;
@Override
public V put(K key, V value) {
maxKeyLength = Math.max(maxKeyLength, key.toString().length());
maxValueLength = Math.max(maxValueLength, value.toString().length());
return value;
};
public int getMaxKeyLength() {
return maxKeyLength;
}
public int getMaxValueLength() {
return maxValueLength;
}
}
请注意,这忽略了你也删除项目的明显情况 - 根据你的使用模式,如果你还想在删除具有最长键的条目时缩小列,你将需要做一些或更多的工作/值。
答案 1 :(得分:0)
您可以使用for-each循环并将其打印出来,对吗?没有必要的尺寸..
尽管“桌子”是什么意思?
How print out the contents of a HashMap<String, String> in ascending order based on its values?
答案 2 :(得分:0)
您可能想要获取地图的所有键,重复键并打印详细信息,例如
Map<String, String> valueMap = new HashMap<String, String>();
.....
Set<String> keys = valueMap.keySet();
Iterator<String> iter = keys.iterator();
while(iter.haxNext()){
String key = iter.next();
System.out.println("\t"+key+"|\t"+valueMap.get(key));
}
编辑:如果您想要特定宽度,请考虑使用Apache StringUtils,如下所示:
int MAXWIDTH = 20; //<- set this with the max width of the column
Map<String, String> valueMap = new HashMap<String, String>();
.....
Set<String> keys = valueMap.keySet();
Iterator<String> iter = keys.iterator();
while(iter.haxNext()){
String key = iter.next();
System.out.println(StringUtils.rightPad(key, MAXWIDTH)+ "|"+
StringUtils.rightPad(valueMap.get(key), MAXWIDTH));
}
答案 3 :(得分:0)
我编写了一个小代码,它将打印HashMap与打印查询结果的方式类似(不完全相同)(如sqlplus)。只是在这里分享,以便它可以帮助一些人。
List<Map<String, Object>> resultSet = jdbcTemplate.queryForList(selectQuery);
Map<String, Integer> maxColSizeMap = new HashMap<String, Integer>();
boolean initMaxColSizeMap = true;
for (Map<String, Object> map : resultSet) {
for (String key : map.keySet()) {
if (initMaxColSizeMap) {
String ColValue = (map.get(key) == null ) ? "" : map.get(key).toString();
Integer whoIsBig = Math.max(ColValue.length(), key.length());
maxColSizeMap.put(key, whoIsBig);
} else {
String ColValue = (map.get(key) == null ) ? "" : map.get(key).toString();
Integer whoIsBig = Math.max(ColValue.length(), key.length());
whoIsBig = Math.max(maxColSizeMap.get(key), whoIsBig);
maxColSizeMap.put(key, whoIsBig);
}
}
initMaxColSizeMap = false;
}
// Column HEADER
for (Map<String, Object> map : resultSet) {
System.out.println("");
StringBuilder colName = new StringBuilder();
StringBuilder underLine = new StringBuilder();
for (String key : map.keySet()) {
colName.append(StringUtils.rightPad(key, maxColSizeMap.get(key)));
colName.append(" ");
underLine.append(StringUtils.repeat('-', maxColSizeMap.get(key)));
underLine.append(" ");
}
// Do one time only
System.out.println(colName.toString());
System.out.println(underLine.toString());
break;
}
// Print the rows
for (Map<String, Object> map : resultSet) {
StringBuilder row = new StringBuilder();
for (String key : map.keySet()) {
String str = map.get(key) == null ? "" : map.get(key).toString();
row.append(StringUtils.rightPad(str, maxColSizeMap.get(key) + 1));
}
System.out.println(row);
}
System.out.println("");
注意:org.apache.commons.lang3.StringUtils用于填充 这个问题不是问题的准确答案,因此请根据需要调整代码。