HashMap:一键,多个值

时间:2011-11-22 15:41:17

标签: java

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

14 个答案:

答案 0 :(得分:80)

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

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

答案 1 :(得分:29)

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

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

答案 2 :(得分:11)

这是我在类似问题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]

答案 3 :(得分:9)

你有这样的东西吗?

HashMap<String, ArrayList<String>>

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

答案 4 :(得分:8)

标准Java HashMap无法为每个键存储多个值,您添加的任何新条目都将覆盖前一个。

答案 5 :(得分:5)

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

Map<Key, Collection<Value>>

你必须自己维护价值表

答案 6 :(得分:4)

我发现随机搜索的博客,我认为这将有助于这样做: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!)
}
}

答案 7 :(得分:1)

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>

答案 8 :(得分:1)

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

就我而言,它是 2,所以我选择了这个而不是 List<string>.

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

答案 9 :(得分:0)

考虑使用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");

答案 10 :(得分:0)

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

答案 11 :(得分:0)

您可以执行以下操作(根据需要添加访问修饰符):

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)。

答案 12 :(得分:0)

编写一个包含所需所有值的新类,并将新类的对象用作HashMap中的值

HashMap<String, MyObject>

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

答案 13 :(得分:0)

这里是代码如何将哈希图提取到数组中,该哈希图包含arraylist

Map<String, List<String>> country_hashmap = new HashMap<String, List<String>>();
List<String> my = new ArrayList<String>();
arraylist.add("16873538.webp");
arraylist.add("16873539.webp");
country_hashmap.put("Malaysia", my);

// make another one
List<String> jpn = new ArrayList<String>();
soraru.add("16873540.webp");
soraru.add("16873541.webp");
country_hashmap.put("Japanese", jpn);

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