如何获取此地图中第一个键的第三个值?这可能吗?
答案 0 :(得分:80)
存在执行此操作的库,但最简单的Java方法是创建Map
List
,如下所示:
Map<Object,ArrayList<Object>> multiMap = new HashMap<>();
答案 1 :(得分:29)
听起来你正在寻找multimap。 Guava有各种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++;
}
}