2012-06-13 27 views
12

Java HashMap(または他のもの)の内容をSTDOUTなどにダンプするにはどうすればよいですか?ハッシュマップの内容をどのようにダンプするのですか?

例として、私は次の構造の複雑なHashMapを持っていることとします

(student1 => Map(name => Tim,   
        Scores => Map(math => 10, 
            physics => 20, 
            Computers => 30), 
        place => Miami, 
        ranking => Array(2,8,1,13), 
       ), 
student2 => Map ( 
        ............... 
        ............... 
       ), 
............................ 
............................ 
); 

だから私は、データ構造についてのアイデアを得るために、画面にそれを印刷したいと思います。 私はPHPのvar_dump()やPerlのdumper()に似たものを探しています。

+0

あなたは 'toString()'を試しましたか? –

答えて

20

使用HashMap.toString()docs here):

System.out.println("HASH MAP DUMP: " + myHashMap.toString()); 

は一般的に、このようなデータをダンプするObject.toString()を使用しています。

+0

配列以外は正常に動作します。 '{list_mem = {validate_data = {name = STRING、place = DONT_KNOW}、func = getMemList、elems = [I @ 973678}}'の印刷を参照してください。ここで 'elems'は配列であり、その値は出力されません。 –

0

私はしばしば、このような機能を使用します(Map内の他のタイプのオブジェクトのprety-printに対応するために拡張する必要があります)。したがって、ここでも出力

[student2] -> (Hash) 
    [name] -> [Ivan the Terrible] 
    [place] -> [Dungeon] 

[student1] -> (Hash) 
    [name] -> [Bob the Student] 
    [place] -> [Basement] 
    [ranking] -> {2, 8, 1, 13, } 
    [Scores] -> (Hash) 
    [math] -> [0] 
    [business] -> [100] 

を生成するコード

public static void main(String[] cmd) { 
    Map<String,Object> document = new HashMap<String, Object>(); 

    Map<String,Object> student1 = new LinkedHashMap<String, Object>(); 
    document.put("student1", student1); 
    student1.put("name", "Bob the Student"); 
    student1.put("place", "Basement"); 
    List<Integer> ranking = new LinkedList<Integer>(); 
    student1.put("ranking", ranking); 
    ranking.add(2); 
    ranking.add(8); 
    ranking.add(1); 
    ranking.add(13); 
    Map<String,Object> scores1 = new HashMap<String, Object>(); 
    student1.put("Scores", scores1); 
    scores1.put("math", "0"); 
    scores1.put("business", "100"); 

    Map<String,Object> student2= new LinkedHashMap<String, Object>(); 
    document.put("student2", student2); 
    student2.put("name", "Ivan the Terrible"); 
    student2.put("place", "Dungeon"); 

    System.out.println(hashPP(document)); 
} 

以下

@SuppressWarnings("unchecked") 
private static String hashPP(final Map<String,Object> m, String... offset) { 
    String retval = ""; 
    String delta = offset.length == 0 ? "" : offset[0]; 
    for(Map.Entry<String, Object> e : m.entrySet()) { 
     retval += delta + "["+e.getKey() + "] -> "; 
     Object value = e.getValue(); 
     if(value instanceof Map) { 
      retval += "(Hash)\n" + hashPP((Map<String,Object>)value, delta + " "); 
     } else if(value instanceof List) { 
      retval += "{"; 
      for(Object element : (List)value) { 
       retval += element+", "; 
      } 
      retval += "}\n"; 
     } else { 
      retval += "["+value.toString()+"]\n"; 
     } 
    } 
    return retval+"\n"; 
} // end of hashPP(...) 

。特定のニーズに合わせてこれを変更する必要があるかもしれません。

+0

連結の代わりに 'StringBuilder'を使用してください。また、 'offset'がvarargsである点は何ですか?任意のジェネリック型パラメータ、生の型と安全でないキャストの組み合わせ? –

+0

1)この機能をデバッグに使用する場合、文字列連結を使用しても差異はありません。 2)オフセット変数をvaragrsとして持つことにより、別の関数hashPP(map <,>m)の作成を避けることができます。return hashPP(m、 ""); } – Dmitri

+0

また、私はこの関数をデバッグプリントアウトに使用しているので、私のコードキーのほとんどは通常文字列であり、値はいくつかの汎用オブジェクトまたは同様の性質の別のハッシュマップであることが分かります。より一般的なものにするためには、オブジェクトのキーも作成します。 – Dmitri

1

データ構造(たとえば、ネストされたマップ、配列、セットなど)をダンプするには、フォーマット済みのJSONにシリアル化するのが良い方法です。たとえば、Gson(com.google.gson)を使用している場合:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
System.out.println(gson.toJson(dataStructure)); 

これは、最も複雑なデータ構造をかなり読みやすい方法で印刷します。

関連する問題