2012-02-12 4 views
1

일부 조건에 대해 true를 리턴하는 HasMap의 서브 세트 크기를 쉽게 찾을 수 있습니까?Java HashMap의 서브 세트 계산하기

의 내가이 있다고 가정 해 봅시다 :

HashMap<Company, Revenue> results; 

을 내가 수익의 기업의 수를 찾으려는 것은 10

편집 : 자바는 더 나은 빠른 경우 내가 알고 싶은 솔루션, for-loop 이외의.

+0

@ FabianBarney의 답은 가장 일반적인 해결책을 제시합니다. 거꾸로 된 인덱스를 요구하고 있으며 각 키 (수익)에 대해 여러 값이있을 수 있으므로 MultiMap 데이터 구조가 필요합니다. 자신 만의 글을 쓰는 것은 어렵지 않지만 Guava 구현을 사용할 수있는 이유는 무엇입니까? –

답변

0

성능에 신경 쓰시거나 답변이 필요하십니까? 단순 버전 :

int count = 0; 
for (Revenue r : results.values()) { 
    if (r.equals(10)) { // I'm not sure what your revenue class is, exactly. Add appropriate comparison here. 
    count++ 
    } 
} 

맵은 일반적으로 키 기반이므로 값 기반 작업은 일반적으로 비효율적입니다. 코드의

+0

감사합니다 anser, 방금 내 질문을 업데이 트되었습니다. –

0

시도에 따라 조각 당신은 그냥 변수의 수를 저장 반대로 그들에 대한 몇 가지 작업을 수행해야 할 때 회사 전체 개체를 사용할 수 있도록합니다 목록에 회사를 저장

List<Company> comp = new ArrayList<Company>(); 
for(Company cp : results.keySet()){ 
    if(results.get(cp).equals(10)){ 
    comp.add(cp); 
    } 
} 

장점.

0

실제로 값을 반복하지 않고이를 수행 할 방법이 없다고 생각합니다. 검색하려는 값에 의해 입력되고 Revenue 객체 목록을 포함하는 값으로 다른 맵을 가질 수 있습니다. 그러나 이것은 분명히 역동적이지 않고 꽤 못 생깁니다.

1

Guava Multimap을 두 번째 맵으로 사용할 수 있습니다. 이 맵은 여러 값을 하나의 키와 연관시킵니다. 따라서 현재지도를 반대로하고 수익을 키로 사용하고 여러 회사를 키와 연관시킬 수 있습니다.

그런 다음 특정 수익을 위해 모든 회사를 쉽게 얻을 수 있습니다.

ListMultimap<Revenue, Company> revenue2Companies = ArrayListMultimap.create(); 
Revenue rev = ...; 

List<Company> companies = revenue2Companies.get(rev); 

사용할 구현의 javadoc을 읽으십시오. 키로 사용되는 클래스의 경우 적절한 equals 메소드를 구현해야합니다. 말했다

SetMultimap<Revenue, Company> companiesByRevenue = 
    Multimaps.invertFrom(Multimaps.forMap(results), HashMultimap.create()); 
// view results as a Multimap, and then invert the key/value relationship to 
// find all keys associated with each value 
return companiesByRevenue.get(desiredRevenue); // Set<Company> 

, 이것은 당신이 확인해야합니다 경우 표준 for 루프에 비해 단지 빠른 ...

1

GuavaMultimap 아마 가장 간단한 솔루션입니다 A,하지만 @Fabian 바니 알보다 쉽게 서로 다른 수익을 가진 여러 쿼리. 하나의 특정 수익 값으로 회사를 검색 할 필요가 있다면 간단한 for 루프보다 빠른 해결책이 없습니다.

+0

또한, @FabianBarney, Multimap docs에 게시 한 링크는 매우 오래된 - 릴리스 3이지만 구아바는 릴리스 11에 있습니다! (내가 본 Guava 사용자 가이드/위키에 링크되어 있습니다.) –

+0

감사합니다. 내 게시물을 업데이트했습니다. –

관련 문제