일부 조건에 대해 true를 리턴하는 HasMap의 서브 세트 크기를 쉽게 찾을 수 있습니까?Java HashMap의 서브 세트 계산하기
의 내가이 있다고 가정 해 봅시다 :
HashMap<Company, Revenue> results;
을 내가 수익의 기업의 수를 찾으려는 것은 10
편집 : 자바는 더 나은 빠른 경우 내가 알고 싶은 솔루션, for-loop 이외의.
일부 조건에 대해 true를 리턴하는 HasMap의 서브 세트 크기를 쉽게 찾을 수 있습니까?Java HashMap의 서브 세트 계산하기
의 내가이 있다고 가정 해 봅시다 :
HashMap<Company, Revenue> results;
을 내가 수익의 기업의 수를 찾으려는 것은 10
편집 : 자바는 더 나은 빠른 경우 내가 알고 싶은 솔루션, for-loop 이외의.
성능에 신경 쓰시거나 답변이 필요하십니까? 단순 버전 :
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++
}
}
맵은 일반적으로 키 기반이므로 값 기반 작업은 일반적으로 비효율적입니다. 코드의
감사합니다 anser, 방금 내 질문을 업데이 트되었습니다. –
시도에 따라 조각 당신은 그냥 변수의 수를 저장 반대로 그들에 대한 몇 가지 작업을 수행해야 할 때 회사 전체 개체를 사용할 수 있도록합니다 목록에 회사를 저장
List<Company> comp = new ArrayList<Company>();
for(Company cp : results.keySet()){
if(results.get(cp).equals(10)){
comp.add(cp);
}
}
장점.
실제로 값을 반복하지 않고이를 수행 할 방법이 없다고 생각합니다. 검색하려는 값에 의해 입력되고 Revenue 객체 목록을 포함하는 값으로 다른 맵을 가질 수 있습니다. 그러나 이것은 분명히 역동적이지 않고 꽤 못 생깁니다.
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
루프에 비해 단지 빠른 ...
@ FabianBarney의 답은 가장 일반적인 해결책을 제시합니다. 거꾸로 된 인덱스를 요구하고 있으며 각 키 (수익)에 대해 여러 값이있을 수 있으므로 MultiMap 데이터 구조가 필요합니다. 자신 만의 글을 쓰는 것은 어렵지 않지만 Guava 구현을 사용할 수있는 이유는 무엇입니까? –