2012-10-30 97 views
1

這是一個非常普遍的問題。我有一個hashmap,並且我想要以表格格式動態打印它,而不事先知道內容的大小。這個表應該像我們在一個Db查詢結果中看到的那樣分開。有沒有任何庫/實用程序直接有助於此類轉換?或者JAVA有一些我可以利用的內在功能?動態地以格式化表格格式打印HashMap

我寫的代碼是非常天真的代碼,並且不符合字符串的動態長度。我還需要對齊行。

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

可以發佈你試過的代碼的成果嗎? – sunleo

+0

是否要在網頁或控制檯上打印 – Suranga

回答

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

注意這忽略了明顯的情況下,也會刪除的項目 - 這取決於你的使用模式,如果您還想在刪除具有最長鍵/值的條目時收縮列,則必須進行一些或更多工作。

+0

我喜歡這個擴展HashMap並記錄最大長度的想法。感謝你的回答!!! – user1063185

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

格式化問題仍未解決,行也應該彼此對齊。 – user1063185

+0

@ user1063185:您確實需要什麼?你能分享一個簡單的例子嗎? –

+0

@ user1063185:請使用填充檢查更新後的答案。 –

0

我寫了一個小代碼,它將打印與查詢結果打印(如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用於填充。
這一個不是問題的確切答案,所以根據需要調整代碼。