1

这是一个非常笼统的问题。我有一个哈希图,我想在不事先知道内容大小的情况下以表格格式动态打印它。该表应该像我们在 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

4 回答 4

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;
    }
}

请注意,这忽略了您还删除项目的明显情况 - 根据您的使用模式,如果您还想在删除具有最长键/值的条目时缩小列,则必须做一些或更多的工作。

于 2012-10-30T15:21:57.573 回答
1

我编写了一个小代码,它将打印类似于(不完全)查询结果的打印方式(如 sqlplus)的 HashMap。只是在这里分享,以便它可以帮助一些人。

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

于 2014-03-19T06:32:12.337 回答
0

您可以使用 for-each 循环并将其打印出来,对吗?不需要大小..

“桌子”是什么意思?

如何根据值以升序打印 HashMap<String, String> 的内容?

于 2012-10-30T15:13:24.293 回答
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));
     }
于 2012-10-30T15:15:01.833 回答