2012-11-20 3 views
0

내 목록은 다음 필드 하우스의 객체를 포함 :java 중첩 된 보고서를 생성하는 가장 효율적인 방법은 무엇입니까?

private Integer address; 
private String street; 
private double price; 
private int rooms; 

나는 객실의 수량, 다음 해당 주택의 목록을 얼마나 많은 주택 수의 객실을 나열하는 보고서를 생성하고 싶습니다. 아래와 비슷합니다. 이 개 객실

주택 : 3

-Mainstreet, 1112, $ 45,000.00

-Mainstreet, 1456, $ 42,200.00

-Oak, 54, 3 개 객실 43,600.00

주택 : 1

-mainstreet, 1890, $ 52000.00

방/수량 키 쌍을 가진 해시 맵을 생각한 다음 해시 맵을 사용하여 배열을 만들었지 만 일련의 루프를 실행하는 것보다 더 쉬운 것이 있어야합니다. 어떤 제안?

Map<Integer, List<House>> map = new HashMap<Integer, List<House>>(); 

그런 다음지도를 구축하기리스트를 한 번 반복 :

답변

1

이 당신이 필요합니다.

for(House h: houses){ 
    List<House> l = map.get(h.rooms); 
    if(l==null){ 
     l = new ArrayList<House>(); 
     map.put(h.rooms, l); 
    } 
    l.add(h); 
} 

map.get (3)은 3 개의 방이있는리스트 하우스를 반환합니다.

그럼 끝났습니다.

+0

그래서 목록을 값 유형으로 사용하고 방 수를 키로 사용할 수 있습니다. 완벽하고 간단합니다! 감사합니다 – Michael

0

찾고있는 데이터 구조는 멀티 맵입니다. java 용 Guava에는 몇 가지 구현이 있습니다. @Pawel Solarski의 내부 목록을 처리합니다.

이렇게하면 보고서를 실행하기 위해 모든 데이터가 정리됩니다.

+0

죄송합니다, 지금은 외부 컬렉션을 사용하지 않기로 선택했습니다. @Pawel Solarski의 대답은 완벽했습니다. 제안 해 주셔서 감사합니다. – Michael

1

comparator을 작성하여 객실 수를 비교 한 다음 가격을 타이 브레이커로 사용합니다. 당신이 Collections 클래스로 목록을 정렬하는 데 사용할 수있는이

class HouseComparator implements Comparator<House>{ 
    public int compare(House a,House b){ 
     int value = Integer.compare(a.rooms, b.rooms); 
     if (value == 0) 
     { 
      value = Double.compare(a.price, b.price); 
     } 
     return value; 
    } 
} 

비슷 해요.

관련 문제