web-dev-qa-db-ja.com

Javaコレクションをきれいに印刷(toStringはきれいな出力を返さない)

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

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

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

196

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

System.out.println(Arrays.toString(stack.toArray()));
296
Zach Langley
String.join(",", yourIterable);

(Java 8)

46
user1016765

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

18
tlavarea

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

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

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

15
bsmk

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

Apache Commons ToStringBuilder をお勧めします。それを使用すると、この種のメソッドを記述する必要があります。

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

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

Person @ 7f54 [name = Stephen、age = 29]

反射実装 もあります。

12
Chinnery

System.out.println(Collection c)は、あらゆる種類のコレクションを読み取り可能な形式で既に印刷しています。コレクションにユーザー定義オブジェクトが含まれる場合のみ、ユーザー定義クラスにtoString()を実装してコンテンツを表示する必要があります。

10
Shekhar

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

Iterables.toString(myIterable)

9
Ben

独自のクラスで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();
    }

}

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

9
joel.neely

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]

グアバドキュメント

5
Chisey88

Apache Commonsでは、呼び出したい

StringUtils.join(myCollection, ",")
3
JRA_TLL

Java8で

//will prints each element line by line
stack.forEach(System.out::println);

または

//to print with commas
stack.forEach(
    (ele)->{
               System.out.print(ele+",");
           }
);
2
YogiEHunt

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

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

}
1
Shekhar

ほとんどのコレクションには、最近のJavaに便利なtoString()があります(Java7/8)。したがって、必要なものを連結するためにストリーム操作を行う必要はありません。コレクション内の値クラスのtoStringをオーバーライドするだけで、必要なものを取得できます。

AbstractMapAbstractCollection の両方は、要素ごとに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 }}
  }
}
1
Alex

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

org.Apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);
0
user1016765

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

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

0
Uri

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

0
Harneet