224

Stack<Integer>オブジェクトを Eclipse デバッガーと同じように (つまり[1,2,3...])きれいに印刷したいのですが、 で印刷しout = "output:" + stackてもこのような良い結果が返されません。

明確にするために、私はJavaの組み込みコレクションについて話しているので、そのコレクションをオーバーライドすることはできませんtoString().

スタックの印刷可能な素敵なバージョンを入手するにはどうすればよいですか?

4

20 に答える 20

336

それを配列に変換してから、次のように出力できますArrays.toString(Object[])

System.out.println(Arrays.toString(stack.toArray()));
于 2008-12-27T20:59:28.307 に答える
60
String.join(",", yourIterable);

(Java 8)

于 2015-03-10T10:28:50.930 に答える
19

Java 8 ストリームとコレクターを使用すると、簡単に実行できます。

String format(Collection<?> c) {
  String s = c.stream().map(Object::toString).collect(Collectors.joining(","));
  return String.format("[%s]", s);
}

最初に with を使用mapObject::toStringて作成Collection<String>し、次に結合コレクターを使用してコレクション内のすべてのアイテムを,区切り文字として結合します。

于 2014-08-13T05:02:52.680 に答える
18

Apache Commonsプロジェクトによって提供されるMapUtilsクラスはMapUtils.debugPrint、マップをきれいに印刷するメソッドを提供します。

于 2011-11-15T23:42:11.747 に答える
17

グアバは良い選択肢のようです:

Iterables.toString(myIterable)

于 2015-12-04T13:00:42.543 に答える
12

System.out.println(Collection c)は、すでに任意のタイプのコレクションを読み取り可能な形式で出力しています。コレクションにユーザー定義オブジェクトが含まれている場合にのみ、コンテンツを表示するためにユーザー定義クラスにtoString()を実装する必要があります。

于 2010-09-08T15:39:20.343 に答える
11

クラスに toString() を実装します。

これを簡単にするために、 Apache Commons ToStringBuilderをお勧めします。それを使えば、この種のメソッドを書くだけです:

public String toString() {
     return new ToStringBuilder(this).
       append("name", name).
       append("age", age).
       toString(); 
}

この種の出力を得るには:

Person@7f54[名前=スティーブン、年齢=29]

リフレクティブ実装もあります。

于 2008-12-27T21:02:11.203 に答える
8

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();
    }

}

これは本格的な実装ではなく、単なるスターターです。

于 2008-12-27T21:47:47.243 に答える
0

これが組み込みのコレクション クラスではなく独自のコレクション クラスである場合は、その toString メソッドをオーバーライドする必要があります。Eclipse は、組み込みの書式設定を持たないオブジェクトに対してその関数を呼び出します。

于 2008-12-27T21:01:51.797 に答える
0

Collection で Sop を呼び出すときは注意してくださいConcurrentModification。例外がスローされる可能性があります。各 Collection の内部toStringメソッドが Collection を内部的に呼び出すためIteratorです。

于 2012-08-19T07:55:52.360 に答える
0

使用してみることができます

org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);
于 2015-09-11T22:35:39.150 に答える
0

前の例を変更して、ユーザー定義オブジェクトを含むコレクションも印刷するようにしました。

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));    
    }

}
于 2010-09-08T17:55:12.733 に答える