Java로 맵을 인쇄하십시오


136

를 인쇄하는 좋은 방법을 찾고 있습니다 Map.

map.toString() 나에게 준다 : {key1=value1, key2=value2, key3=value3}

내 맵 항목 값에서 더 많은 자유를 원하고 다음과 같은 것을 찾고 있습니다. key1="value1", key2="value2", key3="value3"

나는이 작은 코드를 썼다 :

StringBuilder sb = new StringBuilder();
Iterator<Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Entry<String, String> entry = iter.next();
    sb.append(entry.getKey());
    sb.append('=').append('"');
    sb.append(entry.getValue());
    sb.append('"');
    if (iter.hasNext()) {
        sb.append(',').append(' ');
    }
}
return sb.toString();

그러나 나는 이것을하기 위해보다 우아하고 간결한 방법이 있다고 확신합니다.


1
여기에서 요청한 형식과 형식 이 너무 유사 하여 Java에서 Map to String의 복제 가능 System.out.println. 그리고 커스텀 무언가를 원한다면, 이것은 다른 많은 답변이있는 "자바지도를 반복하는 방법"으로 요약됩니다.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


63

또는 당신의 논리를 깔끔한 작은 수업에 넣으십시오.

public class PrettyPrintingMap<K, V> {
    private Map<K, V> map;

    public PrettyPrintingMap(Map<K, V> map) {
        this.map = map;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        Iterator<Entry<K, V>> iter = map.entrySet().iterator();
        while (iter.hasNext()) {
            Entry<K, V> entry = iter.next();
            sb.append(entry.getKey());
            sb.append('=').append('"');
            sb.append(entry.getValue());
            sb.append('"');
            if (iter.hasNext()) {
                sb.append(',').append(' ');
            }
        }
        return sb.toString();

    }
}

용법:

Map<String, String> myMap = new HashMap<String, String>();

System.out.println(new PrettyPrintingMap<String, String>(myMap));

참고 : 해당 논리를 유틸리티 메소드에 넣을 수도 있습니다.


3
이것은 반 패턴 임호입니다. 사소한 이점 (예쁜 인쇄)을 위해 유형에 강한 제약 (상속)을 추가하십시오. 일반 맵을 사용하는 것이 더 좋지만 인수로 사용하는 정적 메소드를 사용하십시오.
OoDeLally

304
Arrays.toString(map.entrySet().toArray())

11
당신이 가지고 있다면 그렇게 좋지 않다면 Map<String, Map<String,double[]>>, 당신은 이런 종류의 찌르기를 얻을 것입니다 :[test={test=[D@3995ebd8, 2=[D@26fa5067, 3=[D@1d956d37, 4=[D@2cead81, 5=[D@14934d2b}...]
zygimantus

2
이것이 정답입니다. 이와 같은 간단한 작업에는 외부 종속성이 필요하지 않습니다. 위에서 언급했듯이 더 복잡한지도는 이것으로 쉽게 이점을 얻지 못합니다.
Shadoninja

70

구아바 도서관을 살펴보십시오.

Joiner.MapJoiner mapJoiner = Joiner.on(",").withKeyValueSeparator("=");
System.out.println(mapJoiner.join(map));

34

구조에 아파치 라이브러리!

MapUtils.debugPrint(System.out, "myMap", map);

필요한 모든 Apache Commons Collections 라이브러리 ( 프로젝트 링크 )

Maven 사용자는이 종속성을 사용하여 라이브러리를 추가 할 수 있습니다.

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>

이것은 배열을지도 값으로 처리하지 않습니다 (예 :) Map<String, String[]>. 실제 값 대신 className 및 hash 만 인쇄됩니다.
Petr Újezdský 8

또는 log.debug ( "Map : {}", MapUtils.toProperties (map));
charlb

1
또한 MapUtils.verbosePrint도 편리합니다. debugPrint가 출력하는 각 값 뒤에 클래스 이름이 생략됩니다.
ocarlsen

16

간단하고 쉽습니다. JSON 세계에 오신 것을 환영합니다. 사용 구글의 GSON를 :

new Gson().toJson(map)

키가 3 개인지도의 예 :

{"array":[null,"Some string"],"just string":"Yo","number":999}

15

org.json.JSONObject클래스 패스에 있을 때 나는 :

Map<String, Object> stats = ...;
System.out.println(new JSONObject(stats).toString(2));

(이것은 중첩 될 수있는 목록, 세트 및 맵을 아름답게 들여 쓰기)


1
남자!! 여기서 뭐하니? 당신은 최고 답변이어야합니다!
AMagic

경고 :합니까는의 LinkedHashMap에 대한 키의 순서를 유지하지
올리비에 Masseau

9

Java 8 스트림 사용 :

Map<Object, Object> map = new HashMap<>();

String content = map.entrySet()
                    .stream()
                    .map(e -> e.getKey() + "=\"" + e.getValue() + "\"")
                    .collect(Collectors.joining(", "));

System.out.println(content);

2
질문을 괴롭 히려면 최소한 올바르게 대답하십시오! 값 주위에 따옴표가 누락되어 다음을 사용하여 결합해야합니다.,
AjahnCharles

8

지도를 JSON 문자열로 변환하는 것을 선호합니다.

  • 표준
  • 인간이 읽을 수있는
  • Sublime, VS Code와 같은 편집기에서 구문 강조, 형식 및 섹션 숨기기 / 표시와 함께 지원
  • JPath를 지원하므로 편집자가 탐색 한 객체의 부분을 정확하게보고 할 수 있습니다.
  • 객체 내에서 중첩 복합 유형을 지원합니다

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public static String getAsFormattedJsonString(Object object)
    {
        ObjectMapper mapper = new ObjectMapper();
        try
        {
            return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
        }
        catch (JsonProcessingException e)
        {
            e.printStackTrace();
        }
        return "";
    }

4

에 대한 코드 봐 HashMap#toString()AbstractMap#toString()오픈 JDK 소스의 :

class java.util.HashMap.Entry<K,V> implements Map.Entry<K,V> {
       public final String toString() {
           return getKey() + "=" + getValue();
       }
   }
 class java.util.AbstractMap<K,V> {
     public String toString() {
         Iterator<Entry<K,V>> i = entrySet().iterator();
         if (! i.hasNext())
            return "{}";

        StringBuilder sb = new StringBuilder();
        sb.append('{');
        for (;;) {
            Entry<K,V> e = i.next();
            K key = e.getKey();
            V value = e.getValue();
            sb.append(key   == this ? "(this Map)" : key);
            sb.append('=');
            sb.append(value == this ? "(this Map)" : value);
            if (! i.hasNext())
                return sb.append('}').toString();
            sb.append(", ");
        }
    }
}

OpenJDK의 사람들이이를 수행하는보다 우아한 방법을 찾지 못하면 :-)가 없습니다.


3

다음을 수행하여 원하는 것을 수행 할 수 있어야합니다.

System.out.println(map) 예를 들어

맵의 모든 객체가 toString사용자가 볼 수 있는 방법을 재정의하는
{key1=value1, key2=value2}한 의미있는 방식으로

이것이 코드에 대한 것이라면 무시 toString하는 것이 좋은 습관이며 대신 대신 사용하는 것이 좋습니다.

객체가있는 예를 들어 String다른 것이 없어도 괜찮습니다.
즉, System.out.println(map)추가 코드없이 필요한 것을 정확하게 인쇄합니다.


1
그의 키와 값은 문자열입니다. 나는 toString 메소드가 tbh를 포함한다고 생각합니다.
Tom

당신이 바로,하지만 아마도 그는 자신의 point.But I 업데이트 답을 만들기 위해 간단한 예제를 복사
Cratylus

예, 내지도가 Map <String, String>임을 표시해야합니다. 그러나 또한 항목 값에서 쉼표로 구분 된 목록과 같이 항목 값에서 더 많은 자유를 원한다고 표시했습니다. 따라서 Map.toString () 은하 지 않습니다.
space_monkey

인터페이스 java.util.Map는에 관한 계약이 없으므로 toString()실제 Map구현 에 따라 System.out.println(map)-> PrintStream.println(map)-> String.valueOf(map)-> map.toString()원인이됩니다. 자주 사용하는 java.util.AbstractMap은에 대한 멋진 문자열 표현을 제공합니다 toString(). ... 다른 Map구현은로 되돌아 가서 Object.toString()정보를 얻지 못할 수도 있습니다 com.example.MyMap@4e8c0de.
Abdull

2
public void printMapV2 (Map <?, ?> map) {
    StringBuilder sb = new StringBuilder(128);
    sb.append("{");
    for (Map.Entry<?,?> entry : map.entrySet()) {
        if (sb.length()>1) {
            sb.append(", ");
        }
        sb.append(entry.getKey()).append("=").append(entry.getValue());
    }
    sb.append("}");
    System.out.println(sb);
}

0

나는 이것과 같은 것이 더 깨끗할 것이라고 생각하고 출력 형식에 더 많은 유연성을 제공합니다 (간단히 템플릿 변경).

    String template = "%s=\"%s\",";
    StringBuilder sb = new StringBuilder();
    for (Entry e : map.entrySet()) {
        sb.append(String.format(template, e.getKey(), e.getValue()));
    }
    if (sb.length() > 0) {
        sb.deleteCharAt(sb.length() - 1); // Ugly way to remove the last comma
    }
    return sb.toString();

마지막 쉼표를 제거 해야하는 것이 추악하다는 것을 알고 있지만 이 솔루션 의 대안 이나 수동으로 반복자를 사용하는 것보다 더 깨끗하다고 ​​생각 합니다.


0

신속하고 더러운 솔루션 레버리지가 기존 인프라, 당신은 당신의 래핑 할 수 uglyPrintedMap으로는 java.util.HashMap, 다음 사용 toString().

uglyPrintedMap.toString(); // ugly
System.out.println( uglyPrintedMap ); // prints in an ugly manner

new HashMap<Object, Object>(jobDataMap).toString(); // pretty
System.out.println( new HashMap<Object, Object>(uglyPrintedMap) ); // prints in a pretty manner

0

정확히 질문에 대답하지는 않지만 Lombodok @ToString 주석을 언급 할 가치가 있습니다. 당신이 주석을 경우 클래스, 다음 일을 의미있는 뭔가를 반환합니다.@ToStringkey / valueSystem.out.println(map)

또한, 예를 들어,지도 수준의지도를 아주 잘 작동 : Map<MyKeyClass, Map<String, MyValueClass>>로 인쇄됩니다

{MyKeyClass(properties...)={string1=MyValuesClass(properties...), string2=MyValuesCalss(properties...),..}, ... }


0

String result = objectMapper.writeValueAsString(map) -이것만큼 간단합니다!

결과:

{"2019-07-04T03:00":1,"2019-07-04T04:00":1,"2019-07-04T01:00":1,"2019-07-04T02:00":1,"2019-07-04T13:00":1,"2019-07-04T06:00":1 ...}

PS는 Jackson JSON을 클래스 경로에 추가합니다.


0

Java 8부터 Lambda를 사용하여 쉽게 수행 할 수있는 방법이 있습니다.

yourMap.keySet().forEach(key -> {
    Object obj = yourMap.get(key);
    System.out.println( obj);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.