1

次のように定義されたマップがあります

HashMap<Object, Object> hashMap;

次に、各ペアを反復処理して、キーと値を出力する必要があります。のようなタイプkey.toString()value.toString()うまく機能しますArrayList。しかしtoString()、配列では読み取り可能な文字列は得られません。

について承知しておりArrays.toString()ます。Arrays.toString()しかし、オブジェクト配列が必要であり、私が持っているのはオブジェクトだけであるため、私の場合は使用できません。そこで、次のようなカスタム コードを作成しました。

private String convertToHumanReadableFormat(Object value) {
    if (value == null) return "N/A";
    if (value.getClass().isArray()) {
        return convertArrayToReadableFormat(value);
    }
    return value.toString();
}

private String convertArrayToReadableFormat(Object value) {
    String output = "[";
    int arrayLength = Array.getLength(value);
    for (int i = 0; i < arrayLength; i++) {
        Object element = Array.get(value, i);
        if (element != null) {
            if (element.getClass().isArray()) {
                output += convertArrayToReadableFormat(element);
            }
            else {
                output += element.toString();
            }
        }
        if ((i + 1) < arrayLength)
            output += ", ";
    }
    output += "]";
    return output;
}

私は実際に何をするかを複製してArrays.deepToString()います。Arrays.toString()しかし、 orを使用する方法がわかりませんArrays.deepToString()

これは問題に対する正しいアプローチですか、それともこれらの標準的な方法を私のために機能させる方法はありますか?

どんな助けでも素晴らしいでしょう。

4

5 に答える 5

1

メソッドconvertToHumanReadableFormatを次のように変更してください。私はそれをテストしましたが、実際に機能しました。

private <T> String convertToHumanReadableFormat(Object value) {
            if (value == null) return "N/A";
            if (value.getClass().isArray()) {
                if( value instanceof int[]||value instanceof long[]){
                    List<T> list = new ArrayList<T>();
                    list.addAll((Collection<? extends T>) Arrays.asList(value));
                    return convertToHumanReadableFormat(list.toArray());

                }else{
                     return Arrays.deepToString((Object[]) value);
                }
            }
            return value.toString();
        }

他のプリミティブ型を if 条件に追加できます。

于 2012-06-22T06:54:34.620 に答える
0

考慮できるいくつかのアプローチがあります
-A.フォーマットに厳密ではなく、HashMapの内容を人間が読める方法で出力したいだけの場合は、JSonシリアライズを使用することをお勧めします-出力は人間が読める場合. Ovirt
オープン ソース プロジェクトで行ったことを確認できます(エンジン プロジェクトの git リポジトリを複製します) - engine\backend\manager\modules\utils\src\main\java\org\ovirt\engine\core\utils\serialization\ json - JsonObjectSerializer クラスを見てください。 B. 形式に厳密な場合 - マップの entrySet を取得し、それを反復処理して、オブジェクトを ArrayList に挿入する必要があります。その後、 toArray() メソッドを使用して配列を返し、上記のメソッドを使用できます。


ArrayList は文字列の ArrayList になることをお勧めします。そのため、各 mapEntry を取得して文字列に変換し、toString() を検討して、生成される形式が適切かどうかを確認する必要があります。

于 2012-06-22T06:53:16.860 に答える
0

ユースケースが配列やその他のオブジェクトグラフを人間が読める形式でレンダリングする場合は、テンプレートソリューション (freemarker の速度など) を使用するか、JSON (または XML) に変換して rpetty pring することができます - このタスクには GSON / XStream をお勧めします.

デバッグ目的で使用したい場合は、ログシステムに固執し、そこで利用可能な標準コンバーターを使用してください(たとえば、log4jで)

于 2012-06-22T06:53:31.433 に答える
0

配列をリストに変換してから toString を使用するとどうなりますか -

Arrays.asList(array)

この方法でヘルパー メソッドを記述する必要があります -

private String convertToHumanReadableFormat(Object value) {
    if (value == null) return "N/A";
    if (value.getClass().isArray()) {
       value = Arrays.asList((Object[])value);     
    }     
    return value.toString(); 
} 

プリミティブを処理するには、最初に手動で配列をリストに変換する必要があります -

private String convertToHumanReadableFormat(Object value) {
    if (value == null) return "N/A";
    if (value.getClass().isArray()) {

       //convert array to list 
       int count = Array.getLength(value);
       ArrayList<Object> list = new ArrayList<Object>();
       for(int i=0; i<count; i++){
          list.add(Array.get(value, i));
       } 
       return list.toString(); //or value=list;  
    }     
    return value.toString(); 
}
于 2012-06-22T06:42:04.240 に答える
0

9 つの instanceof ステートメントを使用して、適切な toString または deepToString メソッドを呼び出すことができます。独自のコードを使用する場合は、必ず StringBuilder を使用し、配列自体または親ディメンションへの参照が含まれる可能性を考慮してください。現在、コードはスタック オーバーフローまで再帰します。私が提案するように instanceof を使用すると、コードに固有のプリミティブ値のボックス化も回避されます (したがって、パフォーマンスが向上します)。9つのステートメントは多すぎませんか?

if (val instanceof Object[]) return Arrays.deepToString((Object[]) val);
if (val instanceof byte[]) return Arrays.toString((byte[]) val);
// Repeat for other 7 array types...
于 2012-06-22T08:27:29.157 に答える