2012-11-29 4 views
0

이것은 사소한 일일 수도 있지만 올바른 방법으로 수행해야합니다.지도에서 개체 그룹화

속성이 country_id 인 사람 개체가 있습니다. 나는 country_id을 기반으로 사람을 그룹화 한 다음 마지막으로 1 Map 개체로 묶어야합니다. 지도는 그래서 흐름이되어야한다 country_id.

에 속하는하여 country_id 같은 키와 사람 개체의 목록과 같은 값을 가져야한다 : 사람을 통해

  • 반복 처리가
  • country_id을 찾아 넣어 객체 목록. 예 : person A(id=10) in list_A
  • 마찬가지로 person B(id-20) in list_B
  • 그런 다음 HashMap에 넣으시겠습니까?

내 최종 오/p를 PersonMap(country_id-<PersonList>,country_id-<PersonList>)

이 정확이 방법 아니면 더 나은 방법이 있어야한다?

답변

3

반복 할 때 사람들을 Map에 넣을 수 있습니다. 지도에 필요한 목록을 찾고 찾지 못하면지도를 만듭니다. 당신의 사람 개체 수,

Map<Integer,List<Person>> map = new HashHap<Integer,List<Person>>(); 

for (Person person : collectionOfPeople) { 
    int cid = person.getCountryId(); 

    List<People> list = map.get(cid); 

    if (list == null) { 
     list = new ArrayList<People>(); 
     map.put(cid,list); 
    } 

    list.add(person); 
} 
0

비교할 값으로 국가 ID를 사용하는 사람 개체에 comparable을 구현할 수 : country_id 가정

작동하는 방법을 모르겠어요으로 PersonMap를 사용하여 int 및 아니다 국가별로 주문하십시오.

2

또는 구글 구아바 구글 구아바 Multimap과를 사용

구현 GROUPBY 프로젝트

및 기능

이 구글 구아바 Multimap과 및 기능을 사용하여 콜렉션과 같은 기능에 의해 그룹을 만드는 방법 중 하나입니다 사용할 수 있습니다.

코드는 바로 메서드를 사용하여 데이터를 그룹화합니다. 여기서 우리는 2 열을 사용하여 부서별로 그룹화합니다.

샘플 출력

 
key = Dev 
    1 : Greg 
    3 : Roman 
key = Support 
    2 : Leo 
    4 : Jobby 
import java.util.Collection; 
import java.util.Iterator; 
import java.util.List; 

import com.google.common.base.Function; 
import com.google.common.collect.Lists; 
import com.google.common.collect.Multimap; 
import com.google.common.collect.Multimaps; 

public class GroupByMultimap { 
    public static void main(String[] args) { 
     Object[] o1 = new Object[] { 1, "Greg", "Dev" }; 
     Object[] o2 = new Object[] { 2, "Leo", "Support" }; 
     Object[] o3 = new Object[] { 3, "Roman", "Dev" }; 
     Object[] o4 = new Object[] { 4, "Jobby", "Support" }; 

     List<Object[]> rows = Lists.newArrayList(o1, o2, o3, o4); 
     Multimap<String, Object[]> grouped = Multimaps.index(rows, 
       new Function<Object[], String>() { 
        @Override 
        public String apply(Object[] item) { 
         return (String) item[2]; 
        } 
       }); 

     Iterator<String> keyIterator = grouped.asMap().keySet().iterator(); 
     while (keyIterator.hasNext()) { 
      String key = keyIterator.next(); 
      System.out.println("key = " + key); 
      Collection<Object[]> dataRows = grouped.get(key); 
      for (Object[] o : dataRows) { 
       System.out.println(String.format(" %d : %s", o[0], o[1])); 
      } 
     } 
    } 
} 
3

GuavaMultimap과 표현식에 의해 인덱싱 반환 index 좋은 방법이있다.

Map<Integer, Collection<Person>> map = multimap.asMap(); 

이보다 더 좋은가, 유창 API가 LambdaJ's grouping function를 통해 사용할 수 있습니다 : 그러나

Group<Person> group = group(personList, by(on(Person.class).getCountryId())); 

, LambdaJ의 당신이하는 것이 필요한 경우

ListMultimap<Integer, Person> multimap = Multimaps.index(personList, new Function<Person, Integer>(){ 
    public Integer apply(Person source){ 
    return source.getCountryId(); 
    } 
}); 

Multimap과 자체는지도로 볼 수있다 그룹 객체에는 맵으로 변환하는 메서드가 없으므로이를 직접 수행해야합니다. 그러나 그룹을 반환 할 수 있도록 인터페이스를 변경할 수 있습니다.