【问题标题】:How can i retrieve the key based on the value present in the multimap?如何根据多图中的值检索密钥?
【发布时间】:2015-12-30 10:15:56
【问题描述】:

我有一些键指向多重映射中的许多值。如何根据多图中存在的值检索密钥。这是我的代码。

   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));
        }
    }
}

上面的代码为我提供如下输出

我需要基于国家/地区的地区名称。

例子:如果我给“澳大利亚”输出应该是“大洋洲”

【问题讨论】:

  • 由于Multimap 中的值不需要是唯一的,您需要决定如何处理相同值的多个键。撇开这一点不谈,您似乎需要迭代所有.entries(),将值与“australia”进行比较并在匹配时返回键。
  • 如果您自己已经找到答案,我建议您关闭问题
  • 您最好创建一张国家到地区的地图,然后通过反转地图创建多地图:Multimap&lt;String, String&gt; regionsToCountriesMultimap = Multimaps.invertFrom(Multimaps.forMap(countriesToRegionsMap), ArrayListMultimap.create());。这有几个好处:1. 你有一张地图,可以用来在恒定时间内获取一个国家的区域,2. 你有一个 Multimap,你可以用来在恒定时间内获取一个地区的所有国家,以及 3. 使用地图可确保您不能将一个国家/地区放在多个区域中(这可以通过您当前的解决方案实现)。

标签: java collections guava


【解决方案1】:

你可以颠倒它

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

并调用 get("yourcountry");

这将为您提供包含您所在国家/地区的密钥

【讨论】:

【解决方案2】:

首先,我建议不要使用原始类型,并在创建 Map 时明确提及 Key 和 Value 类型。

关于根据值检索键的问题,您可以遍历地图的所有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";
    }
}

【讨论】:

    【解决方案3】:

    感谢您的回复。

    我根据list、map和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);
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 这将比使用 Map 并反转它来查找区域具有更高的时间复杂度。
    • 您正在创建一个值是列表的地图......这不就是 Multimap 的用途吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多