programing

Java 컬렉션을 올바르게 인쇄(toString이 예쁜 출력을 반환하지 않음)

randomtip 2022. 8. 31. 21:59
반응형

Java 컬렉션을 올바르게 인쇄(toString이 예쁜 출력을 반환하지 않음)

하고 Stack<Integer> Eclipse 디디 does does does does does does즉즉즉즉즉즉즉즉 。[1,2,3...] )로합니다.out = "output:" + stack이 좋은 결과를 돌려주지 않습니다.

설명하겠습니다 자바의 빌트인 컬렉션을 수 toString().

인쇄 가능한 버전의 스택을 입수하려면 어떻게 해야 합니까?

.Arrays.toString(Object[]):

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

(자바 8)

Java 8 스트림 및 수집기를 사용하면 다음과 같은 작업을 쉽게 수행할 수 있습니다.

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

'아예'를 사용합니다.mapObject::toStringCollection<String> 다음 하여 컬렉션 의 모든 을 collector로 합니다.,딜리미터로 지정합니다.

는 Apache Commons를 합니다.MapUtils.debugPrint을을예예예예프린프프방방방방방방방방방 。

Guava는 좋은 옵션인 것 같습니다.

Iterables.toString(myIterable)

System.out.println(Collection c)은 이미 모든 유형의 컬렉션을 읽을 수 있는 형식으로 인쇄하고 있습니다.컬렉션에 사용자 정의 객체가 포함되어 있는 경우에만 콘텐츠를 표시하려면 사용자 정의 클래스에서 toString()을 구현해야 합니다.

클래스에 toString()을 구현합니다.

Apache Commons ToString Builder를 사용하면 더 쉽게 할 수 있습니다.이 기능을 사용하면 다음과 같은 방법을 쓸 수 있습니다.

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.
}

편집: xukxpvfzflbld의 코멘트에 응답하여 앞서 언급한 케이스에 대해 구현 가능한 예를 제시하겠습니다.

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

다른 방법으로는 Google Guave의 "MoreObjects" 클래스를 사용할 수 있습니다. 이 클래스는 유용한 도우미 기능을 많이 제공합니다.

MoreObjects.toStringHelper(this).add("NameOfYourObject", myCollection).toString());

출력: Name OfYourObject=[1273, 123, 876, 897]

구아바 문서

Java8의 경우

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

또는

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

Apache Commons 3에서는

StringUtils.join(myCollection, ",")

에는 유용한 을 있다toString()(Java7/8)로 표시됩니다.필요한 것을 연결하기 위해 스트림 작업을 수행할 필요가 없습니다. 덮어쓰기만 하면 됩니다.toString필요한 것을 얻을 수 있습니다.

Abstract Map과 Abstract Collection 모두 요소별로 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 }}
  }
}

Java 14 업데이트(2020년 3월)

레코드는 이제 재정의할 필요가 없는 미리보기 기능입니다.toString()당신의 클래스가 데이터만 가지고 있다면.레코드는 데이터 계약을 구현하여 해당 필드에 대한 공개 읽기 전용 액세스 권한을 부여하고 비교, toString 및 해시 코드와 같은 기본 함수를 구현합니다.

그래서 한번은 실장할 수 있었다.Foo동작은 다음과 같습니다.

import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

public class ToString {
  static record Foo(int i) { }
  
  public static void main(String[] args) {
    Foo f = new Foo(10);
    System.out.println(f.toString());
    // prints: Foo[i=10]

    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: [Foo[i=10], Foo[i=12], Foo[i=13], Foo[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=Foo[i=10], 12=Foo[i=12], 13=Foo[i=13], 14=Foo[i=14]}
  }
}

JSON

다른 솔루션으로는 컬렉션을 JSON 형식으로 변환하여 Json-String을 인쇄할 수 있습니다.오브젝트 스트링을 올바르게 포맷하여 읽을 수 있다는 장점이 있습니다.toString().

Google의 Gson을 사용하는 예:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

...

    printJsonString(stack);

...
public static void printJsonString(Object o) {
    GsonBuilder gsonBuilder = new GsonBuilder();
    /*
     * Some options for GsonBuilder like setting dateformat or pretty printing
     */
    Gson gson = gsonBuilder.create();
    String json= gson.toJson(o);
    System.out.println(json);
}

이것이 빌트인이 아닌 자체 컬렉션 클래스인 경우 toString 메서드를 재정의해야 합니다.유선 형식이 없는 오브젝트에 대해 기능하는 이클립스 호출.

방금 이전 예제를 수정하여 사용자 정의 개체를 포함하는 컬렉션을 인쇄했습니다.

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

}

Sop on Collection을 호출할 때 주의하세요. Sop on Collection은 던질 수 있습니다.ConcurrentModification예외.왜냐하면 내부적으로toString각 콜렉션의 내부 호출 방식Iterator콜렉션에 접속합니다.

사용하실 수 있습니다.

org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString(yourCollection);

작업을 단순화할 수 있는 두 가지 방법이 있습니다. 1. Gson 라이브러리 가져오기. 2. 롬복 사용.

둘 다 오브젝트인스턴스에서 String을 작성하는 데 도움이 됩니다.Gson은 당신의 객체를 해석하고 lombok은 당신의 클래스 객체를 string 메서드로 덮어씁니다.

Gson prettyPrint의 예를 들어 오브젝트와 오브젝트 컬렉션을 인쇄하는 도우미 클래스를 만듭니다.lombok을 사용하는 경우 클래스를 @ToString으로 표시하고 객체를 직접 인쇄할 수 있습니다.

@Scope(value = "prototype")
@Component
public class DebugPrint<T> {
   public String PrettyPrint(T obj){
      Gson gson = new GsonBuilder().setPrettyPrinting().create();
      return gson.toJson(obj);
   }
   public String PrettyPrint(Collection<T> list){
      Gson gson = new GsonBuilder().setPrettyPrinting().create();
      return list.stream().map(gson::toJson).collect(Collectors.joining(","));
   }

}

새로운 JDK에는 이미AbstractCollection.toString()실장되어 있습니다.Stack확장AbstractCollection그러니까 전화만 하면 돼toString()컬렉션에 저장:

    public abstract class AbstractCollection<E> implements Collection<E> {
    ...
    public String toString() {
        Iterator<E> it = iterator();
        if (! it.hasNext())
            return "[]";
    
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }

다음을 제외한 모든 컬렉션에 대해 작동해야 합니다.Map지원도 간단합니다.필요한 경우 이 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();
}

언급URL : https://stackoverflow.com/questions/395401/printing-java-collections-nicely-tostring-doesnt-return-pretty-output

반응형