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 に表形式を処理させることができます。

固定の列幅を選択するか、エントリを 1 回反復して各列の最大長を見つけてから、適切なパディングで再度出力することができます。

別のオプションは、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 に答える
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 に答える
0

for-each ループを使用して、それを出力するだけですよね?サイズは必要ありません..

しかし、「テーブル」とはどういう意味ですか?

HashMap<String, String> の内容をその値に基づいて昇順で出力するにはどうすればよいですか?

于 2012-10-30T15:13:24.293 に答える