2012-06-26 20 views
5

: Ben bunu yaptıklarında,MultiMap <Tam Sayı, Foo> Haritasını <Tamsayı, Set <Foo>> Guava'yı kullanarak nasıl dönüştürebilirim? Bunun gibi Google Guava 12 Multimap'de kullanıyorum

Map<Integer, Set<OccupancyType>> 

Ancak: Bu Multimap'de içine değerlerin yerleştirilmesine sonra

Multimap<Integer, OccupancyType> pkgPOP = HashMultimap.create(); 

, dönmek gerek

return pkgPOP.asMap(); 

Map<Integer, Collection<OccupancyType>> 

Bunun yerine Map<Integer, Set<OccupancyType>>'u nasıl döndürebilirim? Burada

cevap

13

Bak this issue and comment #2 by Kevin Bourrillion de, baş Guava dev: İstediğiniz Map<K, Set<V>> sonra ham Haritası'na ilk Map<K, Collection<V>> ve çift yayınlayabileceğim

. Bir işaretlenmemiş uyarıyı bastırmanız gerekir ve o noktada yorum yapmalısınız, "Güvenli çünkü SetMultimap bunu garanti eder." Bu numaradan bahsetmek için SetMultimap javadoc'ı bile güncelleyebilirim.

Yani kontrolsüz cast yapmak:

@SuppressWarnings("unchecked") // Safe because SetMultimap guarantees this. 
final Map<Integer, Set<OccupancyType>> mapOfSets = 
    (Map<Integer, Set<OccupancyType>>) (Map<?, ?>) pkgPOP.asMap(); 

DÜZENLEME:

Guava 15.0 yana daha zarif bir şekilde bunu yapmak için helper method kullanabilirsiniz:

Map<Integer, Set<OccupancyType>> mapOfSets = Multimaps.asMap(pkgPOP); 
+0

+1. Teşekkürler! – brainydexter

+0

En sağdaki cast'ın 'Map' düz olması gerektiğinden emindim, ama belki de artık önemsemediğimiz bir javac versiyonundan kaynaklanıyordu ... emin değilim. –

8

Guava katkıyı:

güvensiz döküm yapın. Güvende olacak.

Java devralma çalışma biçimi nedeniyle Map<K, Set<V>> döndürülmez. Esasen, Multimap supertype bir Map<K, Collection<V>> döndürmelidir ve Map<K, Set<V>>Map<K, Collection<V>> bir alt türü olmadığı için, Map<K, Set<V>> dönmek için asMap() geçersiz kılabilirsiniz.

+0

Louis, sen hiç uyumaz, değil mi ;) – Xaerxess

+0

MultiMap (Set) için hangi uygulamayı kullandığım önemli mi? (Benim durumumda, HashMultiMap kullanıyorum). Eğer böyle bir şey kullanırsam tüm cehennem kırılacak: 'SetMultiMap mapOfSets = LinkedListMultiMap.create()' – brainydexter

+0

Eh, 'LinkedListMultimap'' 'ListMultimap'' 'SetMultimap' değil. _some_ 'SetMultimap 'uygulamasını kullandığınız sürece, ör. "LinkedHashMultimap" veya "TreeMultimap", iyisin. (Ve @Xaerxess, yaz saati boyunca İngiltere saatindeyim.) –

İlgili konular