2016-10-18 4 views
3

2d arraylist를 java의 hashmap으로 변환하는 것에 관한 작은 질문이 있습니다. 나는 데이터 세트가 2D ArrayList를 같이 읽고 다음과 같습니다있다 : 첫 번째 열은 ID와 두 번째 열을 의미Java에서 2D arraylist를 hashmap으로 변환하십시오.

0 1 

0 2 

1 2 

1 3 

는 항목을 의미합니다. 나는 자바에서 해시 맵을 사용하여 항목 집합 자주 만들 싶습니다 출력이 나는이 코드를 사용하지만 그들에 대한 몇 가지 문제가

1 0 

2 0 1 

3 1 

과 같아야합니다

HashMap<Integer, ArrayList<Integer>> map = new HashMap<Integer, ArrayList<Integer>>(); 
for(Integer elem : data){ 
     map.put(elem[1], elem[0]); 
} 

데이터가 내 2D의 ArrayList입니다.

오류 메시지가 어떤 도움을 이해할 수있을 것이다

incompatible types: ArrayList<Integer> cannot be converted to Integer 
    for(Integer elem : data){ 
        ^

했다!

답변

1

당신은 다음과 같이 이동 :

List<List<Integer>> inputData = ... 

Map<Integer, List<Integer>> dataAsMap = new HashMap<>(); 
for(List<Integer> row : data){ 
    Integer id = row.get(0); 
    Integer item = row.get(1); 
    List<Integer> rowInMap = dataAsMap.get(item); 
    if (rowInMap == null) { 
    rowInMap = new ArrayList<>(); 
    dataAsMap.put(item, rowInMap); 
    } 
    rowInMap.add(id); 
} 

일부 노트 :

  1. 당신 만 인터페이스 유형의 목록을 사용하는한다지도를 ... 유형 (당신은 단지를 지정으로
  2. 문제는 다음과 같습니다. List of Lists에서 for-each를 사용할 때 ... indi를 얻지 못합니다. vidual "cells"대신에 Lists [list of iterating lists ... iteration of iteration]리스트를 얻습니다.]

그러면 내부 목록의 요소를 가져 와서 푸시하는 것입니다. 지도로. 주의해야 할 또 하나의 부분 : List 객체의 Map을 만들고 싶습니다. 그리고 그 List 객체도 생성해야합니다!

(필자는 위의 코드를 컴파일러를 통해 실행하지 않았으므로 오타에주의해야하지만 일반적으로 필요한 내용을 알려주고 있어야합니다. 코드가 무엇인지 알지 못하면 에 println 문이나

+0

감사합니다 많이! 정말 감사! – BigD

0

여기에 그 일 중 하나 쉬운 방법입니다) 디버거에서 실행이 :

  1. Map<Integer, List<Integer>>
  2. 당신의 ArrayList를 반복하세요.
  3. key가 이미지도에 있는지 확인하십시오. 키가있는 경우 목록을 검색하고 값을 목록에 추가하거나 값이있는 새 목록을 만듭니다.

프로그램 :

class FooBar { 
    public static void main (String[] args) throws Exception { 
     int[][] data = {{0,1}, {0,2}, {1,2}, {1,3}}; 
     Map<Integer, List<Integer>> myMap = new HashMap<>(); 

     for(int i = 0; i < 4; i++) { 
      List<Integer> values = myMap.containsKey(data[i][0]) ? 
            myMap.get(data[i][0]) : new ArrayList<>(); 
      values.add(data[i][1]); 
      myMap.put(data[i][0], values); 
     } 

     System.out.println(myMap); 
    } 
} 

출력 :

{0=[1, 2], 1=[2, 3]} 

이것은 단지 기본적인 방법을 도시한다. 사용자의 필요에 맞게 수정할 수 있습니다.예를 들어 List<Integer> 대신 String을 입력하고 에 값을 추가하도록 선택하면 List에 값을 추가 할 수 있습니다.

EDIT : 여기

입력으로 List<List<Integer>>와 샘플 프로그램이다. 여기서이 목록의 이름을 input으로 가정합니다.

프로그램 :

class FooBar { 
    public static void main (String[] args) throws Exception { 
     /* Input Data */ 
     List<List<Integer>> input = new ArrayList<>(); 
     input.add(new ArrayList<Integer>(){{add(0); add(1);}}); 
     input.add(new ArrayList<Integer>(){{add(0); add(2);}}); 
     input.add(new ArrayList<Integer>(){{add(1); add(2);}}); 
     input.add(new ArrayList<Integer>(){{add(1); add(3);}}); 

     Map<Integer, List<Integer>> myMap = new HashMap<>(); 
     for(int i = 0; i < input.size(); i++) { 
      List<Integer> values = myMap.containsKey(input.get(i).get(0)) ? 
            myMap.get(input.get(i).get(0)) : new ArrayList<>(); 
      values.add(input.get(i).get(1)); 
      myMap.put(input.get(i).get(0), values); 
     } 

     System.out.println(myMap); 
    } 
} 

출력 :

{0=[1, 2], 1=[2, 3]} 
+0

고마워요! 그러나 입력 데이터가 arraylist라면 어떨까요? – BigD

+0

@ lixx3013'ArrayList' 인 경우'int [] []'대신 iterate해야합니다. 개정 된 답변을 살펴보십시오. – user2004685

+0

많은 도움을 주셔서 감사합니다! – BigD