Stack<Integer>
オブジェクトを Eclipse デバッガーと同じように (つまり[1,2,3...]
)きれいに印刷したいのですが、 で印刷しout = "output:" + stack
てもこのような良い結果が返されません。
明確にするために、私はJavaの組み込みコレクションについて話しているので、そのコレクションをオーバーライドすることはできませんtoString()
.
スタックの印刷可能な素敵なバージョンを入手するにはどうすればよいですか?
Stack<Integer>
オブジェクトを Eclipse デバッガーと同じように (つまり[1,2,3...]
)きれいに印刷したいのですが、 で印刷しout = "output:" + stack
てもこのような良い結果が返されません。
明確にするために、私はJavaの組み込みコレクションについて話しているので、そのコレクションをオーバーライドすることはできませんtoString()
.
スタックの印刷可能な素敵なバージョンを入手するにはどうすればよいですか?
それを配列に変換してから、次のように出力できますArrays.toString(Object[])
。
System.out.println(Arrays.toString(stack.toArray()));
String.join(",", yourIterable);
(Java 8)
Java 8 ストリームとコレクターを使用すると、簡単に実行できます。
String format(Collection<?> c) {
String s = c.stream().map(Object::toString).collect(Collectors.joining(","));
return String.format("[%s]", s);
}
最初に with を使用map
しObject::toString
て作成Collection<String>
し、次に結合コレクターを使用してコレクション内のすべてのアイテムを,
区切り文字として結合します。
Apache Commonsプロジェクトによって提供されるMapUtilsクラスはMapUtils.debugPrint
、マップをきれいに印刷するメソッドを提供します。
グアバは良い選択肢のようです:
System.out.println(Collection c)は、すでに任意のタイプのコレクションを読み取り可能な形式で出力しています。コレクションにユーザー定義オブジェクトが含まれている場合にのみ、コンテンツを表示するためにユーザー定義クラスにtoString()を実装する必要があります。
クラスに toString() を実装します。
これを簡単にするために、 Apache Commons ToStringBuilderをお勧めします。それを使えば、この種のメソッドを書くだけです:
public String toString() {
return new ToStringBuilder(this).
append("name", name).
append("age", age).
toString();
}
この種の出力を得るには:
Person@7f54[名前=スティーブン、年齢=29]
リフレクティブ実装もあります。
toString()
独自のクラスをオーバーライドすること (およびそのプロセスを可能な限り自動化すること) に関する上記のコメントに同意します。
定義していないクラスについてToStringHelper
は、自分の好みに合わせて処理したいライブラリ クラスごとに、オーバーロードされたメソッドを持つクラスを作成できます。
public class ToStringHelper {
//... instance configuration here (e.g. punctuation, etc.)
public toString(List m) {
// presentation of List content to your liking
}
public toString(Map m) {
// presentation of Map content to your liking
}
public toString(Set m) {
// presentation of Set content to your liking
}
//... etc.
}
編集: xukxpvfzflbbld によるコメントに応答して、前述のケースの可能な実装を次に示します。
package com.so.demos;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ToStringHelper {
private String separator;
private String arrow;
public ToStringHelper(String separator, String arrow) {
this.separator = separator;
this.arrow = arrow;
}
public String toString(List<?> l) {
StringBuilder sb = new StringBuilder("(");
String sep = "";
for (Object object : l) {
sb.append(sep).append(object.toString());
sep = separator;
}
return sb.append(")").toString();
}
public String toString(Map<?,?> m) {
StringBuilder sb = new StringBuilder("[");
String sep = "";
for (Object object : m.keySet()) {
sb.append(sep)
.append(object.toString())
.append(arrow)
.append(m.get(object).toString());
sep = separator;
}
return sb.append("]").toString();
}
public String toString(Set<?> s) {
StringBuilder sb = new StringBuilder("{");
String sep = "";
for (Object object : s) {
sb.append(sep).append(object.toString());
sep = separator;
}
return sb.append("}").toString();
}
}
これは本格的な実装ではなく、単なるスターターです。
これが組み込みのコレクション クラスではなく独自のコレクション クラスである場合は、その toString メソッドをオーバーライドする必要があります。Eclipse は、組み込みの書式設定を持たないオブジェクトに対してその関数を呼び出します。
Collection で Sop を呼び出すときは注意してくださいConcurrentModification
。例外がスローされる可能性があります。各 Collection の内部toString
メソッドが Collection を内部的に呼び出すためIterator
です。
使用してみることができます
org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);
前の例を変更して、ユーザー定義オブジェクトを含むコレクションも印刷するようにしました。
public class ToStringHelper {
private static String separator = "\n";
public ToStringHelper(String seperator) {
super();
ToStringHelper.separator = seperator;
}
public static String toString(List<?> l) {
StringBuilder sb = new StringBuilder();
String sep = "";
for (Object object : l) {
String v = ToStringBuilder.reflectionToString(object);
int start = v.indexOf("[");
int end = v.indexOf("]");
String st = v.substring(start,end+1);
sb.append(sep).append(st);
sep = separator;
}
return sb.toString();
}
public static String toString(Map<?,?> m) {
StringBuilder sb = new StringBuilder();
String sep = "";
for (Object object : m.keySet()) {
String v = ToStringBuilder.reflectionToString(m.get(object));
int start = v.indexOf("[");
int end = v.indexOf("]");
String st = v.substring(start,end+1);
sb.append(sep).append(st);
sep = separator;
}
return sb.toString();
}
public static String toString(Set<?> s) {
StringBuilder sb = new StringBuilder();
String sep = "";
for (Object object : s) {
String v = ToStringBuilder.reflectionToString(object);
int start = v.indexOf("[");
int end = v.indexOf("]");
String st = v.substring(start,end+1);
sb.append(sep).append(st);
sep = separator;
}
return sb.toString();
}
public static void print(List<?> l) {
System.out.println(toString(l));
}
public static void print(Map<?,?> m) {
System.out.println(toString(m));
}
public static void print(Set<?> s) {
System.out.println(toString(s));
}
}