2015-12-30 90 views
2

我有一些鍵指向多圖中的許多值。我如何檢索基於multimap中存在的值的鍵。這是我的代碼。如何根據multimap中存在的值檢索密鑰?

package com.manoj; 

import java.util.Set; 

import com.google.common.collect.ArrayListMultimap; 
import com.google.common.collect.Multimap; 

public class GuavaMap 
{ 
    public static void main(String[] args) 
    { 
     Multimap regions = ArrayListMultimap.create(); 
     regions.put("asia", "afganistan"); 
     regions.put("asia", "bangladesh"); 
     regions.put("asia", "inida"); 
     regions.put("asia", "japan"); 
     regions.put("asia", "burma"); 
     regions.put("europe", "andorra"); 
     regions.put("europe", "austria"); 
     regions.put("europe", "belgium"); 
     regions.put("europe", "cyprus"); 
     regions.put("oceania","australia"); 
     regions.put("oceania", "fiji"); 
     regions.put("oceania", "nauru"); 
     Set<String> keys = regions.keySet(); 
     System.out.println("key\t\t\t"+"values\t\t\t"); 
     System.out.println(); 
     String comp = null; 
     for(String key : keys) 
     { 
      System.out.print(key); 
      System.out.println(regions.get(key)); 
     } 
    } 
} 

上面的代碼如下 enter image description here

我提供的輸出,我需要的區域名稱基礎上的國家。

舉例:如果我給「澳大利亞」輸出應該是「大洋洲」

+0

作爲價值觀上解決了'Multimap'是唯一不要求你必須決定如何處理多個鍵相同的值。除此之外,看起來你需要迭代所有的'.entries()',將這個值與「澳大利亞」進行比較,並在匹配時返回鍵值。 – jensgram

+0

看看這個問題,http://stackoverflow.com/questions/8066109/bidirectional-multi-valued-map-in-java – awsome

+0

我會建議關閉這個問題,如果你已經自己找到了答案 –

回答

0

首先,我想建議不要使用原始類型和明確提到重點和值類型在創建地圖。

關於你的問題取決於價值的檢索關鍵字,您可以遍歷地圖的所有entries做同樣類似:

class GuavaMap 
{ 
    //Explicitly mentioned key and value both are Strings here 
    public static Multimap<String, String> regions = ArrayListMultimap.<String, String>create(); 
    public static void main(String[] args) 
    { 
     regions.put("asia", "afganistan"); 
     regions.put("asia", "bangladesh"); 
     regions.put("asia", "inida"); 
     regions.put("asia", "japan"); 
     regions.put("asia", "burma"); 
     regions.put("europe", "andorra"); 
     regions.put("europe", "austria"); 
     regions.put("europe", "belgium"); 
     regions.put("europe", "cyprus"); 
     regions.put("oceania","australia"); 
     regions.put("oceania", "fiji"); 
     regions.put("oceania", "nauru"); 
     Set<String> keys = regions.keySet(); 
     System.out.println("key\t\t\t"+"values\t\t\t"); 
     System.out.println(); 
     String comp = null; 
     for(String key : keys) 
     { 
      System.out.print(key); 
      System.out.println(regions.get(key)); 
     } 

     //usage of below defined method 
     String region = getRegion("australia"); 
     System.out.println("Region for australia:" + region); 
    } 

    // Function to get the region name i.e. key 
    public static String getRegion(String country){ 
     for(Entry<String, String> entry : regions.entries()){ 
      if(entry.getValue().equals(country)) 
       return entry.getKey(); 
     } 
     return "Not found"; 
    } 
} 
2

你可以反其道而行

Multimap<String, String> invregions = Multimaps.invertFrom(regions , ArrayListMultimap.<String, String>create()); 

,並調用get (「你的國家」);

這會給你包含你的國家的鑰匙

+0

有趣,錯過了谷歌圖書館:)。雖然我無法在MultiMap區域定位方法'inverse'。 –

+3

['inverse()'](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMultimap.html#inverse())僅適用於['ImmutableMultimap '](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMultimap.html)。請參閱['Multimaps.invertFrom(Multimap)'](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimaps.html#invertFrom(com.google.common。 collect.Multimap,%20M))。 – mfulton26

+0

正確@ mfulton26,答案已更新 – kuhajeyan

-2

感謝您的回覆。

我發現基於該列表,地圖和HashMap

package com.manoj; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Scanner; 

public class NestedList 
{ 
    public static void main(String[] args) 
    { 
     List asia = Arrays.asList("afganistan","japan","india","pakistan","singapore","sri lanka"); 
     List europe = Arrays.asList("albania","belarus","iceland","russia","norway","turkey"); 
     List middleEast = Arrays.asList("australia","new zealand","samoa","tonga","vanuatu"); 

     Map region = new HashMap<>(); 
     region.put("asia",asia); 
     region.put("europe", europe); 
     region.put("middleeast" ,middleEast); 
     String reg = null; 
     String val = null; 
     for(Object key : region.keySet()) 
     { 
      reg = key.toString(); 
      Iterator it = ((List) region.get(key)).iterator(); 
      while(it.hasNext()) 
      { 
       val = it.next().toString(); 
       if(val.equalsIgnoreCase("india"))//here you have to provide the country name 
       { 
        System.out.println(reg); 
       } 
      } 
     } 
    } 
} 
+1

這比使用Map並將其反轉爲查找區域的時間複雜度要高。 –

+0

您正在創建一個Map,其值是列表......是不是Multimap的用途? – mfulton26