【问题标题】:Print HashMap in formatted table format dynamically动态打印格式化表格式的 HashMap
【发布时间】:2012-10-19 23:12:43
【问题描述】:

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

【问题讨论】:

  • 可以发布您尝试过的代码成果吗?
  • 你想打印在网页上还是控制台上

标签: java hashmap format


【解决方案1】:

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

“桌子”是什么意思?

How print out the contents of a HashMap<String, String> in ascending order based on its values?

【讨论】:

    【解决方案2】:

    您可能想要获取地图的所有键,迭代键并打印详细信息,例如

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

    【讨论】:

    • 格式化问题仍未解决,行也应该相互对齐..
    • @user1063185:你到底需要什么?你能分享一个简单的例子吗?
    【解决方案3】:

    看起来您已经确定了迭代并且正在处理格式。您可以将其放入 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;
        }
    }
    

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

    【讨论】:

    • 我喜欢扩展 HashMap 并记录最大长度的想法。谢谢解答!!!
    【解决方案4】:

    我编写了一个小代码,它将打印类似于(不完全)查询结果的打印方式(如 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 用于填充。
    这不是问题的确切答案,因此请根据需要调整代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多