Eclipseデバッガー(Stack<Integer>
)と同じように[1,2,3...]
オブジェクトを印刷したいのですが、out = "output:" + stack
で印刷してもこのNice結果は返されません。
明確にするために、Javaの組み込みコレクションについて説明しているので、toString()
をオーバーライドすることはできません。
スタックの印刷可能なバージョンを入手するにはどうすればよいですか?
それを配列に変換してからArrays.toString(Object[])
で出力できます:
System.out.println(Arrays.toString(stack.toArray()));
String.join(",", yourIterable);
(Java 8)
Apache Commonsプロジェクトが提供するMapUtilsクラスは、マップをきれいに印刷するMapUtils.debugPrint
メソッドを提供します。
Java 8ストリームとコレクターを使用すると、簡単に実行できます。
String format(Collection<?> c) {
String s = c.stream().map(Object::toString).collect(Collectors.joining(","));
return String.format("[%s]", s);
}
まず、map
とObject::toString
を使用してCollection<String>
を作成し、次に結合コレクターを使用して、コレクション内のすべてのアイテムを,
を区切り文字として結合します。
クラスにtoString()を実装します。
Apache Commons ToStringBuilder をお勧めします。それを使用すると、この種のメソッドを記述する必要があります。
public String toString() {
return new ToStringBuilder(this).
append("name", name).
append("age", age).
toString();
}
この種の出力を取得するには:
Person @ 7f54 [name = Stephen、age = 29]
反射実装 もあります。
System.out.println(Collection c)は、あらゆる種類のコレクションを読み取り可能な形式で既に印刷しています。コレクションにユーザー定義オブジェクトが含まれる場合のみ、ユーザー定義クラスにtoString()を実装してコンテンツを表示する必要があります。
グアバは良い選択肢のようです:
独自のクラスでtoString()
をオーバーライドすることに関する(およびそのプロセスを可能な限り自動化することに関する)上記のコメントに同意します。
did n't定義するクラスの場合、自分の好みに合わせて処理したい各ライブラリクラスのオーバーロードメソッドを使用して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();
}
}
これは本格的な実装ではなく、単なるスターターです。
Javaの "Objects"クラスを使用できます(1.7以降で使用可能)
Collection<String> myCollection = Arrays.asList("1273","123","876","897");
Objects.toString(myCollection);
出力:1273、123、876、897
もう1つの可能性は、Google Guaveの "MoreObjects"クラスを使用することです。これは、多くの便利なヘルパー関数を提供します。
MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());
出力:NameOfYourObject = [1273、123、876、897]
Apache Commonsでは、呼び出したい
StringUtils.join(myCollection, ",")
Java8で
//will prints each element line by line
stack.forEach(System.out::println);
または
//to print with commas
stack.forEach(
(ele)->{
System.out.print(ele+",");
}
);
前の例を修正して、ユーザー定義オブジェクトを含むコレクションも印刷するようにしました。
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));
}
}
ほとんどのコレクションには、最近のJavaに便利なtoString()
があります(Java7/8)。したがって、必要なものを連結するためにストリーム操作を行う必要はありません。コレクション内の値クラスのtoString
をオーバーライドするだけで、必要なものを取得できます。
AbstractMap と AbstractCollection の両方は、要素ごとにtoStringを呼び出してtoString()を実装します。
以下は、動作を示すためのテストクラスです。
import Java.util.List;
import Java.util.ArrayList;
import Java.util.Map;
import Java.util.HashMap;
public class ToString {
static class Foo {
int i;
public Foo(int i) { this.i=i; }
@Override
public String toString() {
return "{ i: " + i + " }";
}
}
public static void main(String[] args) {
List<Foo> foo = new ArrayList<>();
foo.add(new Foo(10));
foo.add(new Foo(12));
foo.add(new Foo(13));
foo.add(new Foo(14));
System.out.println(foo.toString());
// prints: [{ i: 10 }, { i: 12 }, { i: 13 }, { i: 14 }]
Map<Integer, Foo> foo2 = new HashMap<>();
foo2.put(10, new Foo(10));
foo2.put(12, new Foo(12));
foo2.put(13, new Foo(13));
foo2.put(14, new Foo(14));
System.out.println(foo2.toString());
// prints: {10={ i: 10 }, 12={ i: 12 }, 13={ i: 13 }, 14={ i: 14 }}
}
}
あなたが使用してみることができます
org.Apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);
Map
を除くanyコレクションで動作するはずですが、サポートも簡単です。必要に応じて、これらの3文字を引数として渡すようにコードを変更します。
static <T> String seqToString(Iterable<T> items) {
StringBuilder sb = new StringBuilder();
sb.append('[');
boolean needSeparator = false;
for (T x : items) {
if (needSeparator)
sb.append(' ');
sb.append(x.toString());
needSeparator = true;
}
sb.append(']');
return sb.toString();
}
これが組み込みクラスではなく独自のコレクションクラスである場合、そのtoStringメソッドをオーバーライドする必要があります。 Eclipseは、ハードワイヤード形式を持たないオブジェクトに対してその関数を呼び出します。
コレクションでSopを呼び出すときは注意してください。ConcurrentModification
例外がスローされる可能性があります。内部的に各コレクションのtoString
メソッドは、コレクションに対してIterator
を内部的に呼び出すためです。