Java에서 맵을 List로 변환하는 방법?


675

Map<key,value>를 a 로 변환하는 가장 좋은 방법은 무엇입니까 List<value>? 모든 값을 반복하여 목록에 삽입하거나 무언가를 간과합니까?


1
지도를 목록으로 변환해야한다면 좋은 모델이 아니라고 생각합니다. 이 상황이 발생하지 않도록 코드를 작성해야합니다.
버그가 발생했습니다

답변:


1299
List<Value> list = new ArrayList<Value>(map.values());

가정 :

Map<Key,Value> map;

7
감사! 나는에서 주조 가정 한 CollectionList일 것입니다.
as a

1
작동하지 않는 이유는 values ​​()에 의해 반환 된 컬렉션이 기본 Map에 의존하기 때문입니다. 대신 복사 생성자 호출을 수행하여 스토리지를 할당하고 해당 스토리지에 값을 복사하여 연결을 끊습니다 ...
Sheldon R.

4
LinkedHashMap이있는 경우 주문이 동일하게 유지됩니까?

1
@ user2022068 예, 주문은 LinkedHashMap으로 유지되어야합니다.
SusanW

1
@SheldonR. 예 - 컬렉션에 의해 반환 keySet()하고 values()(기본 구조의 설정 또는 컬렉션보기를 제공 심 오브젝트 일반적으로 keySet()더 속는을 강조하지로 돌아 세트). 의 경우 values()반환 된 객체 는 일List있지만 종종 그렇지 않을 수도 있습니다. 실제 목록을 만들면 링크가 끊어 지므로 더 이상 원래지도에 의존하지 않습니다. 그러나 일부 API에는 하나만 필요하기 때문에 List 만 있으면됩니다. 좋은 API는 얻을 수있는 가장 추상적 인 인터페이스 만 필요하다는 규칙을 강화합니다.
SusanW

137

여기서 문제 Map는 두 개의 값 (키와 값) List이 있고 하나의 값 (요소) 만 있다는 것입니다.

따라서 수행 할 수있는 최선 List의 방법은 키 또는 값을 얻는 것 입니다. (키 / 값 쌍을 유지하기 위해 랩퍼를 만들지 않는 한).

우리에게 Map:

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

메소드 로 리턴 된 키를 List새로 작성하여 키를 얻을 수 있습니다 .ArrayListSetMap.keySet

List<String> list = new ArrayList<String>(m.keySet());

메소드 로 리턴 된 값 List에서 새 값을 작성하면 다음 과 같은 값을 얻을 수 있습니다 .ArrayListCollectionMap.values

List<String> list = new ArrayList<String>(m.values());

Listof 키 를 얻은 결과 :

사과
다른
여보세요

List값 을 얻은 결과 :

3.14
요소
세계

3
이러한 메소드에 의해 리턴 된 값의 순서는 정의 되어 있지 않으며HashMap 유사한 분류되지 않은 Map구현에 대해서는 사실상 무작위입니다.
Joachim Sauer

1
예, 그것이 LinkedHashMap이거나 그런 종류의 것임을 알아야합니다. 원래 질문의 문제점은 질문이 잘못되었다는 것, 즉 편집이 필요하다는 것입니다. 문제는지도를 목록으로 변환하는 것이 아니라지도의 값을 목록으로 얻는 방법입니다. 메소드 값은 Collection을 제공하지만 목록은 제공하지 않으므로 깔끔한 트릭이 필요합니다.
demongolem 2013

@ M0les의 답변을 추가 할 수 있다고 생각합니다. 어떻게 든 SortedMap을 "통과"해야합니다. 구체적인 SortedMap 구현 (TreeMap과 같은)으로 시작하거나 입력 맵을 SortedMap에 삽입 한 다음 List로 변환하기 전에
Ignacio Rubio

41

Java 8 Streams API 사용

List<Value> values = map.values().stream().collect(Collectors.toList());

8
받아 들여진 생성자 기반 답변을 선호합니다. 스트림은 코드를 단순화하기위한 것이어야합니다.
Aaron

1
@Aaron 예, Map에서 값 목록을 가져 오는 작업의 생성자는 더 단순한 것 같습니다. 그러나 코드베이스에서 스트림을 광범위하게 사용하는 경우 일관성을 유지하는 것이 좋습니다.
Matej Kormuth

1
내가 대량의 데이터를 가져 오는 경우 이것을 사용하면 오류가 발생합니다. .thread는 java.util.stream.ReduceOps $ 3.makeSink (Unknown Source)에서 반복됩니다. 스레드가 무한 루프되면 CPU 소비가 급증하기 시작합니다. 루핑 스레드 스택 추적은 다음과 같습니다.
Ganesh Giri

24

map.entrySet()Map.Entry키와 값을 모두 포함하는 객체 모음을 제공합니다 . 그런 다음 이것을 원하는 컬렉션 개체로 변환 할 수 있습니다 (예 : new ArrayList(map.entrySet());


23

무엇의 목록?

가정 map은 당신의 인스턴스Map

  • map.values() 를 반환합니다 Collection모든지도 값을 포함 합니다.
  • map.keySet()Set지도의 모든 키 가 포함 된를 반환 합니다.

14

에 포함 된 값 Maplist? 가장 쉬운 values()방법은 Map인터페이스 의 메소드 를 호출하는 것입니다 . 이것은에 Collection포함 된 값 객체를 반환합니다 .Map .

이것은 객체에 Collection의해 뒷받침되며 Map객체에 대한 모든 변경 사항 Map은 여기에 반영됩니다. 따라서 Map객체에 바인딩되지 않은 별도의 사본을 원하면 아래 List처럼 ArrayListCollection을 전달하는 것과 같이 새 객체 를 만들면 됩니다.

ArrayList<String> list = new ArrayList<String>(map.values());

6

당신은 이렇게 할 수 있습니다

List<Value> list = new ArrayList<Value>(map.values());

1
OP는 List <value>로 변환하는 방법에 대해 묻습니다. 답변을 제공 할 때는 제안 된 솔루션에 좋은 설명을 포함시키는 것이 좋습니다. 이 질문은 이미 승인되었습니다.
HaveNoDisplayName

5

결과의 값 List<Value>이 입력의 키 순서에 있는지 확인하려면 Map<Key, Value>"이동"해야합니다.SortedMap 어떻게 든 .

어느 시작 콘크리트 용으로 SortedMap(예 : 구현 TreeMap) 또는 입력을 삽입 MapSortedMap해당 변환하기 전에 List. 예 :

Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));

그렇지 않으면 Map구현이 제공 하는 기본 순서를 얻습니다. 종종 자연 키 순서 ( 다양한 시도 Hashtable또는) 이외의 것일 수 있습니다 ConcurrentHashMap.


5
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("java", 20);
    map.put("C++", 45);

    Set <Entry<String, Integer>> set = map.entrySet();

    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);

리스트에 키와 값 쌍을 둘 수 있으며,리스트를 반복하여 Map.Entry를 사용하여 키와 값을 얻을 수 있습니다.


4
// you can use this
List<Value> list = new ArrayList<Value>(map.values());

// or you may use 
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());    
}

1
"Map<String , String > map = new HapshMap<String , String>;
 map.add("one","java");
 map.add("two" ,"spring");
 Set<Entry<String,String>> set =  map.entrySet();
 List<Entry<String , String>> list = new ArrayList<Entry<String , String>>    (set);
 for(Entry<String , String> entry : list ) {
   System.out.println(entry.getKey());
   System.out.println(entry.getValue());
 } "

1

map에서 값을 얻는 일반적인 방법은 다음과 같습니다.

public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
    List<T> thingList = new ArrayList<>();

    for (Map.Entry<String, T> entry : map.entrySet()) {
        thingList.add(entry.getValue());
    }

    return thingList;
}

1
HashMap<Integer, List<String>> map = new HashMap<>(); 
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
    return new ArrayList<String>((Collection<? extends String>) map.values());
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.