动态打印格式化表格式的HashMap

时间:2012-10-30 15:10:39

标签: java hashmap format

这是一个非常通用的问题。我有一个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

4 个答案:

答案 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用于填充 这个问题不是问题的准确答案,因此请根据需要调整代码。