【问题标题】:HashMap: One Key, multiple ValuesHashMap:一键多值
【发布时间】:2011-11-22 15:41:17
【问题描述】:

如何获取此地图中第一个键的第三个值?这可能吗?

【问题讨论】:

  • 我可以通过使用 HashMap::get 的成员函数通过第三个值获取键的第一个值吗?不幸的是,我找不到任何代码。
  • 您找不到自己的代码?这就是他所说的。
  • 听起来你可能对键和散列键之间的区别有点困惑。希望这会让你明白:en.wikipedia.org/wiki/Hashmap
  • 一个 Map 不能有多个值对应一个键,但你可以有一个 Collection 作为值

标签: java


【解决方案1】:

存在执行此操作的库,但最简单的纯 Java 方法是创建 MapList,如下所示:

Map<Object,ArrayList<Object>> multiMap = new HashMap<>();

【讨论】:

  • 然而,使用库可能比自己动手、测试等更简单......
  • 此解决方案仅在 ArrayList 中的对象来自同一类型时才有效。 S, f.e.不可能有一个带有 int 和 double 值的键..
  • @JonSkeet 哪个是此用例的推荐库?
  • @gaurav:我已经很久没有进入 Java 世界了,我不想说。不过我会看看番石榴。
【解决方案2】:

听起来您正在寻找multimapGuava 有各种Multimap 实现,通常通过Multimaps 类创建。

我建议使用该实现可能比滚动您自己的实现更简单,确定 API 的外观,在添加值时仔细检查现有列表等。如果您的情况特别厌恶第三派对库可能值得这样做,但除此之外,Guava 是一个很棒的库,它可能也会帮助你处理其他代码:)

【讨论】:

  • Apache Commons Collections 也有一个Multimap 实现。
  • 更新了 Apache Commons 的链接MultiMap
  • 大声笑两个坏链接。
  • @GC_:嗯,是的,这个帖子已经有将近 9 年的历史了。那个会发生。轻松修复,无需“大声笑”。 (或者你的意思是 Apache commons 的?在这种情况下,与其笑,我仍然认为更具建设性的回应是发布新链接:MultiMap
【解决方案3】:

例如:

Map<Object,Pair<Integer,String>> multiMap = new HashMap<Object,Pair<Integer,String>>();

Pair 是一个参数类

public class Pair<A, B> {
    A first = null;
    B second = null;

    Pair(A first, B second) {
        this.first = first;
        this.second = second;
    }

    public A getFirst() {
        return first;
    }

    public void setFirst(A first) {
        this.first = first;
    }

    public B getSecond() {
        return second;
    }

    public void setSecond(B second) {
        this.second = second;
    }

}

【讨论】:

    【解决方案4】:

    这是我在类似问题的answer 中发现的

    Map<String, List<String>> hm = new HashMap<String, List<String>>();
    List<String> values = new ArrayList<String>();
    values.add("Value 1");
    values.add("Value 2");
    hm.put("Key1", values);
    
    // to get the arraylist
    System.out.println(hm.get("key1"));
    

    结果:[值 1,值 2]

    【讨论】:

    • System.out.println(hm.get("Key1"));
    【解决方案5】:

    标准的 Java HashMap 不能为每个键存储多个值,您添加的任何新条目都会覆盖之前的条目。

    【讨论】:

      【解决方案6】:

      你有这样的东西吗?

      HashMap<String, ArrayList<String>>
      

      如果是这样,您可以遍历您的 ArrayList 并使用 arrayList.get(i) 获取您喜欢的项目。

      【讨论】:

      • 如何将元素添加到arraylist并进行迭代
      【解决方案7】:

      我在随机搜索中找到了博客,我认为这将有助于这样做:http://tomjefferys.blogspot.com.tr/2011/09/multimaps-google-guava.html

      public class MutliMapTest {
      public static void main(String... args) {
         Multimap<String, String> myMultimap = ArrayListMultimap.create();
      
         // Adding some key/value
         myMultimap.put("Fruits", "Bannana");
         myMultimap.put("Fruits", "Apple");
         myMultimap.put("Fruits", "Pear");
         myMultimap.put("Vegetables", "Carrot");
      
         // Getting the size
         int size = myMultimap.size();
         System.out.println(size);  // 4
      
         // Getting values
         Collection<String> fruits = myMultimap.get("Fruits");
         System.out.println(fruits); // [Bannana, Apple, Pear]
      
         Collection<string> vegetables = myMultimap.get("Vegetables");
         System.out.println(vegetables); // [Carrot]
      
         // Iterating over entire Mutlimap
         for(String value : myMultimap.values()) {
            System.out.println(value);
         }
      
         // Removing a single value
         myMultimap.remove("Fruits","Pear");
         System.out.println(myMultimap.get("Fruits")); // [Bannana, Pear]
      
         // Remove all values for a key
         myMultimap.removeAll("Fruits");
         System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!)
      }
      }
      

      【讨论】:

      • 最好和最简单的感谢 ozan。谢谢番石榴。
      【解决方案8】:

      尝试使用集合来存储键的值:

      Map<Key, Collection<Value>>
      

      你必须自己维护价值列表

      【讨论】:

        【解决方案9】:

        Apache Commons 集合类是解决方案。

            MultiMap multiMapDemo = new MultiValueMap();
        
            multiMapDemo .put("fruit", "Mango");
            multiMapDemo .put("fruit", "Orange");
            multiMapDemo.put("fruit", "Blueberry");
        
            System.out.println(multiMap.get("fruit"));
           // Mango Orange Blueberry
        

        Maven 依赖

            <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -- 
             >
             <dependency>
                 <groupId>org.apache.commons</groupId>
                 <artifactId>commons-collections4</artifactId>
                 <version>4.4</version>
            </dependency>
        

        【讨论】:

          【解决方案10】:

          除了这里的所有答案之外,我还有一个我使用过的解决方案,如果您知道要添加到您的密钥中的多个值的长度,我发现它最有用。

          就我而言,它是 2,所以我选择了这个而不是 List&lt;string&gt;.

          HashMap<String, String[]> multimap= new HashMap<>();
          multimap.put("my_key", new String[]{"my_value1", "my_value2"});
          

          【讨论】:

            【解决方案11】:

            想到一个有 2 个键的 Map,我立即不得不使用用户定义的键,那可能是一个类。以下是关键类:

            public class MapKey {
                private Object key1;
                private Object key2;
            
                public Object getKey1() {
                    return key1;
                }
            
                public void setKey1(Object key1) {
                    this.key1 = key1;
                }
            
                public Object getKey2() {
                    return key2;
                }
            
                public void setKey2(Object key2) {
                    this.key2 = key2;
                }
            }
            
            
            // Create first map entry with key <A,B>.
                    MapKey mapKey1 = new MapKey();
                    mapKey1.setKey1("A");
                    mapKey1.setKey2("B");
            

            【讨论】:

              【解决方案12】:

              HashMap - 使用列表的单键和多值

              Map<String, List<String>> map = new HashMap<String, List<String>>();
              
                // create list one and store values
              
                  List<String> One = new ArrayList<String>();
                  One.add("Apple");
                  One.add("Aeroplane");
              
                  // create list two and store values
                  List<String> Two = new ArrayList<String>();
                  Two.add("Bat");
                  Two.add("Banana");
              
                  // put values into map
                  map.put("A", One);
                  map.put("B", Two);
                  map.put("C", Three);
              

              【讨论】:

                【解决方案13】:

                您可以这样做(根据需要添加访问修饰符):

                Map<String,Map<String,String>> complexMap=new HashMap<String,Map<String,String>>();
                

                你可以这样插入数据:

                    Map<String,String> componentMap = new HashMap<String,String>();
                    componentMap.put("foo","bar");
                    componentMap.put("secondFoo","secondBar");
                    complexMap.put("superFoo",componentMap);
                

                生成的数据结构是:

                {superFoo={secondFoo=secondBar, foo=bar}}
                

                这样键的每个值都应该有一个唯一标识符。如果密钥已知,也会给出 O(1) 的提取时间。

                【讨论】:

                • 那这个怎么设置数据呢?
                • @SaikatBarua 对延迟回复感到抱歉。请检查更新的答案。
                【解决方案14】:

                编写一个新类来保存您需要的所有值,并将新类的对象用作 HashMap 中的值

                HashMap<String, MyObject>
                
                class MyObject {
                public String value1;
                public int value2;
                public List<String> value3;
                }
                

                【讨论】:

                  【解决方案15】:

                  这里是如何将hashmap提取到数组中的代码,hashmap包含arraylist

                  Map<String, List<String>> country_hashmap = new HashMap<String, List<String>>();
                  
                  //Creating two lists and inserting some data in it
                  List<String> list_1 = new ArrayList<String>();
                  list_1.add("16873538.webp");
                  list_1.add("16873539.webp");
                  
                  List<String> list_2 = new ArrayList<String>();
                  list_2.add("16873540.webp");
                  list_2.add("16873541.webp");
                  
                  //Inserting both the lists and key to the Map 
                  country_hashmap.put("Malaysia", list_1);
                  country_hashmap.put("Japanese", list_2);
                  
                  for(Map.Entry<String, List<String>> hashmap_data : country_hashmap.entrySet()){
                        String key = hashmap_data.getKey(); // contains the keys
                        List<String> val = hashmap_data.getValue(); // contains arraylists
                        // print all the key and values in the hashmap
                        System.out.println(key + ": " +val);
                        
                        // using interator to get the specific values arraylists
                        Iterator<String> itr = val.iterator();
                        int i = 0;
                        String[] data = new String[val.size()];
                          while (itr.hasNext()){
                              String array = itr.next();
                              data[i] = array;
                              System.out.println(data[i]); // GET THE VALUE
                              i++;
                          }
                    }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2011-06-24
                    • 2012-05-17
                    • 2015-04-22
                    • 1970-01-01
                    • 2014-12-01
                    • 2018-09-08
                    • 2021-09-10
                    • 1970-01-01
                    相关资源
                    最近更新 更多