2016-06-15 14 views
0

Let'sは、私は文字列/リストのキーは、文字をある元に戻すキー/値の地図

Map<String, List<String>> map = new HashMap<>(); 
map.put("product1", Arrays.asList("res1", "res2")); 
map.put("product2", Arrays.asList("res1", "res2")); 

の地図を持って、その値は今、「数字」

のリストであることを言いました私が達成しようとしているのは、マップ上で反復され、キーとして「数値」のマップを返し、値として「文字」を返します。今の

 <"res1", List<"product1","product2" >> 
    <"res2", List<"product1","product2" >> 

ような何か、私はそれを行うために管理しますが、二段階で、そしてコードはかなり

@Test 
public void test2() throws InterruptedException { 

      List<String> restrictions = Arrays.asList("res1", "res2"); 
    Map<String, List<String>> productsRes = new HashMap<>(); 
    productsRes.put("product1", restrictions); 
    productsRes.put("product2", restrictions); 

    ArrayListMultimap multiMap = productsRes.keySet() 
             .stream() 
             .flatMap(productId -> productsRes.get(productId) 
                    .stream() 
                    .map(restriction -> { 
                     Multimap<String, List<String>> multimap = ArrayListMultimap.create(); 
                     multimap.put(restriction, Arrays.asList(productId)); 
                     return multimap; 
                    })) 
             .collect(ArrayListMultimap::create, (map, restriction) -> map.putAll(restriction), 
               ArrayListMultimap::putAll); 
    Map<String, List<String>> resProducts = Multimaps.asMap(multiMap); 

     } 

どれ提案verbouseようです?。

ありがとうございます!

答えて

0

私はグアバからMultimapはを使用し、そのような結果を収集します:

// the input map 
Map<String, List<String>> lettersNumbers = new HashMap<>(); 
lettersNumbers.put("a", Arrays.asList("1", "2")); 

// the output multimap 
Multimap<String, String> result = 
    lettersNumbers.entrySet() 
        .stream() 
        .collect(ArrayListMultimap::create, 
          (map, entry) -> { 
           entry.getValue().forEach((val) -> 
            map.put(val, entry.getKey())); 
          }, 
          ArrayListMultimap::putAll); 

Multimapは、逆マッピングが含まれていますが。結果をjava.util.Mapオブジェクトにする場合は、Multimap.asMap()を使用します。

+0

ちょうどfyi:guavaには、すでにMultimapのマッピングを逆転させる方法があります。http://stackoverflow.com/questions/3678601/how-to-do-map-inversion-with-guava-with-non-一意の値。 –

関連する問題