18

前回、ここでデータ構造を設定する方法を尋ねました。ここで、PHPで使用するprint_rのように、独自のアルゴリズムを実行せずにマップとリストに入力したものを表すものがあるかどうかを知りたいと思います。

何か案は?

4

9 に答える 9

10

Java の toString() と PHP の print_r() には実際に違いがあります。Java の toString() と同等の __toString() が php にもあることに注意してください。したがって、これは実際の答えではありません。

print_r は、オブジェクトの構造があり、オブジェクトの完全なグラフとその値をすばやく確認したい場合に使用されます。

オブジェクトごとに Java で toString を実装しても、print_r と比較する力はありません。

代わりに gson を使用してください。print_r と同じ仕事をします

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

このように、テストする必要があるすべてのオブジェクトに対して toString を実装する必要はありません。

ドキュメントは次のとおりです。 http://sites.google.com/site/gson/gson-user-guide

デモ クラス (Java):

公開クラスA {

int firstParameter = 0;
B secondObject = new B();

}

公開クラス B {

String myName = "this is my name";  

}

print_r を使用した php の出力は次のとおりです。

Object
(
[firstParameter:private] => 0
[secondObject:private] => B オブジェクト
(
[myName:private] => これは私の名前です
)

)

gson を使用した Java の出力は次のとおりです。

{
"firstParameter": 0,
"secondObject": {
"myName": "これは私の名前です"
}
}

于 2011-05-11T09:32:29.353 に答える
10

コレクションで toString を呼び出すと、すべての要素の文字列表現を含む文字列が返されます。

ただし、これは組み込み配列では機能しません。それらには toString オーバーライドがなく、メモリ アドレスが提供されるだけだからです。

于 2008-09-29T10:39:59.323 に答える
8

やりたいことによっては、解決策はかなり単純になる可能性があります。以下は、print_r が提供するフォーマットされた出力を生成しませんが、リスト、配列、およびマップの構造を出力できます。

    // Output a list
    final List<String> list = new ArrayList<String>();
    list.add("one");
    list.add("two");
    list.add("three");
    list.add("four");
    System.out.println(list);

    // Output an array
    final String[] array = {"four", "three", "two", "one"};
    System.out.println(Arrays.asList(array));

    // Output a map
    final Map<String, String> map = new HashMap<String, String>();
    map.put("one", "value");
    map.put("two", "value");
    map.put("three", "value");
    System.out.println(map.entrySet());

他のタイプのオブジェクトについては、リフレクションを使用してこの目的のためのユーティリティを作成できます。

于 2008-09-29T22:52:04.570 に答える
7

古き良きApacheCommonsLangのToStringBuilderを試してみてください。

于 2008-09-29T10:45:50.293 に答える
2

Javaprint_rのような機能に対する私の見解は、私が作成したクラスRecursiveDumpです。完璧ではありませんが、私にとってはうまく機能しています。使用法は次のとおりです。

String output = RecursiveDump.dump(...);

ジェネリックを使用して改善できる可能性があります。私はジェネリックについて知る前に、何年も前に書きました。また、いくつかのコレクション型を処理しようとしますが、オブジェクトではtoString()メソッドを呼び出すだけです。

Reflection を使用して、適切な のないクラスのフィールド名を抽出することを考えましたtoString()が、Spring Rooの @RooToStringがメソッドを作成できるためtoString()...

もちろん、代わりにデバッガーのインスペクター ツールを使用することもできますが、印刷を使用する方が速い場合もあります。

于 2011-10-25T16:11:16.657 に答える
2

toString()他の人はその方法について言及しています。これは、オブジェクトが を実装する場合にのみ役立ちますtoString()。適切に実装されていない場合、次のような結果になりますjava.lang.Object@1b9240e

少し面倒でもtoString()、独自のクラスに実装するのは簡単ですが、サードパーティのクラスが常に実装するとは限りません。デバッガを使用する方がはるかに優れています。のようなものが PHP に存在する唯一print_rの理由は、実際のデバッガーがないためです。一連の診断用の print ステートメントを使用する代わりにブレークポイントを設定できると、ワークフローが大幅に高速になり、コードがよりクリーンになることがわかると思います。

于 2008-09-29T15:04:30.903 に答える
0

Javaのprint_rに相当するものを知りません。

だが...

すべてのオブジェクトには、toString()メソッドのデフォルトの実装があり、リストおよびマップの実装は、それらに対してtoString()を呼び出すと、その内容を出力します。

デバッグ情報を印刷する必要がある場合は、toString()が探している場所である可能性があります。

于 2008-09-29T10:42:23.250 に答える
0

Javaにはprint_rに相当するものはありません。

ただし、マップまたはリストの場合は、次のようにforeachループを使用できます。

List <String> list = …; // fills your list 

// print each list element 

for (String s : list) {

   System.out.println(s);

 }
于 2008-09-29T10:49:13.810 に答える
0

配列の場合、最も簡単な方法はArrays.asList(array).toString()です。私は通常、デバッグ出力で使用したいオブジェクトにtoString()を実装します。生成されたオブジェクト(JAXBなど)の場合、それを印刷するためにユーティリティクラスを作成する必要があるかもしれません。

于 2008-09-29T10:52:03.617 に答える