2011-08-26 4 views
3

Map을 회전시킬 수있는 Util 라이브러리 (commonsXXX 또는 다른 것)에 함수가 있습니까?지도를 회전하는 Util 기능?

은 "rotate"해야 Map<Permission,Set<User>>이됩니다.

구현하기가 어렵지는 않지만 기존의 일반적인 라이브러리를 사용하면 "두 번 휠을 고안하지 마십시오"라는 측면에서 더 나은 것으로 보입니다.

+0

당신이 도입 된 것으로 간주 되세요 다 대다 관계 사이에있는 UserPermission 클래스? 모든 UserPermissions를 쉽게 반복하고 원하는 구조로 두 개의 멀티 맵을 만들 수 있습니다. –

+0

@ Javid Jamae : 그리 복잡하지는 않지만지도가 연결되지 않아야합니다. 회전 된 것은 연결되지 않은 사본 일 수 있습니다. – Ralph

답변

4

필자가 설명하는 것과 같은 일을 할 필 요가 있었지만 필자는 commons-collections에서 멀티 맵을 사용하고 내 자신의 inverse 함수를 작성했습니다. (적어도 3 년 전 jdk1.4를 사용 했으므로 구아바는 옵션이 아니 었습니다.)

그러나 원래 맵을 SetMultimap으로 변경 한 경우 (키를 값 컬렉션에 매핑 할 때 멀티 맵을 사용하는 것이 더 좋음) 가) 쉽게 값을 삽입 만든다 때문에, 당신은 com.google.common.collect.Multimaps.invertFrom을 사용할 수

public static <K,V,M extends Multimap<K,V>> M invertFrom(Multimap<? extends V,? extends K> source, 
             M dest) 

Copies each key-value mapping in source into dest, with its key and value reversed. 

Parameters: 
    source - any multimap 
    dest - the multimap to copy into; usually empty 
Returns: 
    dest 
0

구아바의 BiMap.inverse()을 살펴보십시오. 그렇지 않으면 MapUtils.invertMap()을 사용할 수 있습니다.

아마도이 점을 생각해 봤지만지도를 뒤집으려면 키와 값이 고유해야합니다.

자세히 살펴에서 편집, 나는 더 공개적으로 사용 가능한 구성 요소가 당신을 위해 것을 을 할 것입니다 확신 해요. 질문을 반전 된 Map<A,B>에서 Map<B,A>으로 읽었습니다.

+0

이 작업이 수행되는지 여부는 확실하지 않습니다. 'inverse()'는'Map , User>'를 반환합니다. – musiKk

0

일부 유틸리티 라이브러리에서 이와 비슷한 것을 발견 할 가능성은 거의 없다고 생각합니다.

단순한 반전이 아니기 때문에 원래지도 값에서 Permission 개 개체의 압축을 풀어야한다고 말하고 있습니다.

+2

아직 구아바가 가지고 있습니다. :-) –

1

가 나도 일반 도서관이를 찾을 수 없습니다, 그래서 여기 내 구현 :

public static <K, V> Map<V, Set<K>> invertMapToSet(Map<K, ? extends Set<V>> ksToVs) { 
    Map<V, Set<K>> vsToKs = new HashMap<V, Set<K>>(); 
    for (Entry<K, ? extends Set<V>> kToVs : ksToVs.entrySet()) { 
     for (V v : kToVs.getValue()) { 
      Set<K> ks = vsToKs.get(v); 
      if (ks == null) { 
       ks = new HashSet<K>(); 
       vsToKs.put(v, ks); 
      } 
      ks.add(kToVs.getKey()); 
     } 
    } 
    return vsToKs; 
}