자바에서 HashMap 인쇄


129

나는 HashMap:

private HashMap<TypeKey, TypeValue> example = new HashMap<TypeKey, TypeValue>();

이제 모든 값을 살펴보고 인쇄하고 싶습니다.

나는 이것을 썼다 :

for (TypeValue name : this.example.keySet()) {
    System.out.println(name);
}

작동하지 않는 것 같습니다.

무엇이 문제입니까?

편집 : 또 다른 질문 :이 컬렉션은 제로 기반입니까? 키가 1 개 있고 값이 0 또는 1이면 크기가 무엇입니까?


2
Java 문서에 익숙해지는 것이 좋습니다 (여러 질문에 대한 답이 될 것입니다). 예를 들어, 다음은 Mapsize()메소드에 대한 문서입니다 . "이지도의 키-값 매핑 수를 반환합니다.지도에 Integer.MAX_VALUE요소 가 더 많은 경우 를 반환합니다 Integer.MAX_VALUE."
Adam Paynter

코드가 키의 값을 찾고 있습니다. 이는 올바르지 않습니다. 키의 키 또는 값의 값을 찾으십시오
d-live

2
키 / 값이 1 개인 경우 당연히 크기 1이됩니다. 그러나 이것은 0 기반 인덱싱과 관련이 없습니다.
Jesper

이것은 좋은 질문입니다. 그러나 여기에 제공된 답변이 Mingfei의 솔루션을 보면 한 줄로 수행 할 수 있습니다.
HoldOffHunger

답변:


140

keySet () 은 해시 맵에서 키 세트 만 반환합니다.이 키 세트를 반복하고이 키를 사용하여 해시 맵에서 값을 가져와야합니다.

귀하의 예에서 해시 맵의 키 유형은 TypeKey이지만 TypeValue일반 for 루프에서 지정했기 때문에 컴파일 할 수 없습니다. 다음으로 변경해야합니다.

for (TypeKey name: example.keySet()){
            String key = name.toString();
            String value = example.get(name).toString();  
            System.out.println(key + " " + value);  
} 

Java8 업데이트 :

 example.entrySet().forEach(entry->{
    System.out.println(entry.getKey() + " " + entry.getValue());  
 });

키 값을 인쇄 할 필요가없고 해시 맵 값만 필요한 경우 다른 사람의 제안을 사용할 수 있습니다.

또 다른 질문 :이 컬렉션이 제로베이스입니까? 키가 1 개이고 값이 0 또는 1이 될까요?

에서 반환 된 컬렉션 keySet()Set입니다 . 인덱스를 사용하여 Set에서 값을 가져올 수 없으므로 0 기반인지 1 기반인지에 대한 질문이 아닙니다. 해시 맵에 하나의 키가있는 경우 반환 된 keySet ()에는 하나의 항목이 포함되고 크기는 1이됩니다.


19
또는 더 나은 방법 :for (Map.Entry<String, String> entry : map.entrySet()) { ... }
Adam Paynter

2
또는 더 콤팩트 : example.forEach((key, value) -> System.out.println("key + " | " + value));
Younes EO

93

키 값 쌍을 보는 간단한 방법 :

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
System.out.println(Arrays.asList(map)); // method 1
System.out.println(Collections.singletonList(map)); // method 2

방법 1과 방법 2 모두 다음을 출력합니다.

[{b=2, a=1}]

21
다음과 같이하십시오 : System.out.println(map);, 출력 :{b=2, a=1}
Mingfei

그래 ... 한 번 더 유사한 출력 :System.out.println(map.toString());
요 앱

1
이 경우 @yoapps는 NPE를 조심하십시오. 그것이 내가 .toString가능한 경우 피하는 이유 입니다.
Maroun

사실입니다. NPE는 항상 그러한 지름길에 숨어 있습니다. 나는 단지 유사한 출력을 보여주고 싶었다. 특히 당신이 로그 / 콘솔로 디버깅 할 때 당신이 알고있는 데이터가 null이 아닌지도를 엿볼 때 특히 생각한다. 이것은 빠른 발사입니다! 그러나 코드를 처음부터 확인하는 경우 ... 당신이 옳고, 까다 롭고 좋은 프로그래밍 컨텍스트에서는 피해야합니다!
Yo Apps

40

을 가지고 있다고 가정하면 다음 Map<KeyType, ValueType>과 같이 인쇄 할 수 있습니다.

for (Map.Entry<KeyType, ValueType> entry : map.entrySet()) {
    System.out.println(entry.getKey()+" : "+entry.getValue());
}

16

키와 값을 모두 인쇄하려면 다음을 사용하십시오.

for (Object objectName : example.keySet()) {
   System.out.println(objectName);
   System.out.println(example.get(objectName));
 }

1
세 번째 줄의 세미콜론 앞에 다른 대괄호가 없습니다.
nktsamba


9

키 세트가 아닌 값 세트를 원합니다.

for (TypeValue name: this.example.values()) {
        System.out.println(name);
}

당신이 제공하는 코드는 컴파일조차하지 않을 것입니다. 이것은 미래의 질문에서 언급 할 가치가있을 것입니다 – "작동하지 않는 것 같습니다"는 약간 모호합니다!


8

Java 8 접근 방식, 사용 BiConsumer및 람다 함수 를 언급 할 가치가 있습니다.

BiConsumer<TypeKey, TypeValue> consumer = (o1, o2) -> 
           System.out.println(o1 + ", " + o2);

example.forEach(consumer);

toString필요한 경우 두 유형의 메서드를 재정의했다고 가정 합니다.


7

나를 위해이 간단한 한 줄이 잘 작동했습니다.

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

6

해시 맵의 참조를 포함하는 변수 이름을 가진 간단한 print 문은 다음과 같은 작업을 수행합니다.

HashMap<K,V> HM = new HashMap<>(); //empty
System.out.println(HM); //prints key value pairs enclosed in {}

이것은 문서 의 추가 정보에 의해 확장 된 toString()메서드가 이미 재정의 되었기 때문에 작동 합니다.AbstractMap classHashMap Class

이지도의 문자열 표현을 반환합니다. 문자열 표현은 중괄호 ( "{}")로 묶인 맵의 entrySet 뷰의 반복자가 반환하는 순서대로 키-값 매핑 목록으로 구성됩니다. 인접한 매핑은 ","(쉼표 및 공백) 문자로 구분됩니다. 각 키-값 매핑은 키, 등호 ( "="), 관련 값으로 렌더링됩니다. 키와 값은 String.valueOf (Object)에 의해 문자열로 변환됩니다.


2
이것은 위의 답변 중 가장 좋은 답변 인 것 같습니다.
Karan Ahuja 2018

5

자바 8 새로운 기능 forEach스타일

import java.util.HashMap;

public class PrintMap {
    public static void main(String[] args) {
        HashMap<String, Integer> example = new HashMap<>();
        example.put("a", 1);
        example.put("b", 2);
        example.put("c", 3);
        example.put("d", 5);

        example.forEach((key, value) -> System.out.println(key + " : " + value));

//      Output:
//      a : 1
//      b : 2
//      c : 3
//      d : 5

    }
}

4

문자열 맵을 사용하여 수행했습니다 (문자열 맵으로 작업하는 경우).

for (Object obj : dados.entrySet()) {
    Map.Entry<String, String> entry = (Map.Entry) obj;
    System.out.print("Key: " + entry.getKey());
    System.out.println(", Value: " + entry.getValue());
}

3
map.forEach((key, value) -> System.out.println(key + " " + value));

Java 8 기능 사용


3
이 코드가 문제를 해결할 수 있지만, 이것이 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이 될 것이며 아마도 더 많은 찬성표를 얻게 될 것입니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Dave

2

HashMap에서 항목을 빠르게 인쇄하는 데 유용합니다.

System.out.println(Arrays.toString(map.entrySet().toArray()));

1

맵이 컬렉션을 값으로 보유하는 경우 다른 답변은 Arrays.deepToString(value.toArray())(목록 값의 맵인 경우) 등과 같이 문자열로 변환하기위한 추가 노력이 필요합니다 .

나는 이러한 문제에 자주 직면했고 ObjectMappers. 이것은 모든 장소에서, 특히 실험하는 동안 매우 편리하며,이 방법을 선택하는 것이 좋습니다.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public static String convertObjectAsString(Object object) {
    String s = "";
    ObjectMapper om = new ObjectMapper();
    try {
        om.enable(SerializationFeature.INDENT_OUTPUT);
        s = om.writeValueAsString(object);
    } catch (Exception e) {
        log.error("error converting object to string - " + e);
    }
    return s;
}

0

쉽게 Entry읽을 수 있도록 수업을 사용할 수 있습니다 HashMap.

for(Map.Entry<TypeKey, TypeKey> temp : example.entrySet()){
    System.out.println(temp.getValue()); // Or something as per temp defination. can be used
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.