Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java中不同类型的HashMap组合到通用HashMap_Java_Hashmap - Fatal编程技术网

将Java中不同类型的HashMap组合到通用HashMap

将Java中不同类型的HashMap组合到通用HashMap,java,hashmap,Java,Hashmap,我的问题从Java中HashMap的一个限制开始,它不允许对同一个键使用多个值。正如在下面编写的代码中一样,我需要为k5和k6设置多个值 map是QueryParameters的主hashmap,我将把它传递给RestAPI请求中使用。 尝试的方法: 创建了字符串和字符串[]类型的不同映射,然后合并,我发现该映射不允许合并。相同的代码已标记为已通过注释// 我的REST请求如下所示,我发现很难通过以下方式发送: https://myURL/api&k1[]=value&k2=2value&k5[

我的问题从Java中HashMap的一个限制开始,它不允许对同一个键使用多个值。正如在下面编写的代码中一样,我需要为k5和k6设置多个值

map是QueryParameters的主hashmap,我将把它传递给RestAPI请求中使用。 尝试的方法: 创建了字符串和字符串[]类型的不同映射,然后合并,我发现该映射不允许合并。相同的代码已标记为已通过注释//

我的REST请求如下所示,我发现很难通过以下方式发送:

https://myURL/api&k1[]=value&k2=2value&k5[]=v3&k5[]=v4&k5[]=v5&k6[]=v7&k6[]=v8&k6[]=v8

如果有任何其他方式来表示在Java中,请让我知道

Map<String, String> map = new HashMap<>();
map.put("k1", "value");
map.put("k2", "2value");
//String[] k5 = new String[]{"v3", "v4", "v5"};
map.put("k5[]", "v3");
map.put("k5[]", "v4");
map.put("k5[]", "v5");
//String[] k6= new String[]{"v7", "v8", "v9"};
map.put("k6[]", "v7");
map.put("k6[]", "v8");
map.put("k6[]", "v9");

其实很简单。以下是您需要执行的操作:

Map<String, String[]> map = new HashMap<>();
map.put("v3", new String[] { "v", "foo", "bar" });   
如果要向其中添加更多元素,可以将贴图定义为map

您需要此地图:

Map<String, List<String>> strings = new HashMap<>();
这将动态创建和删除地图中的列表。例如:

Map<String, List<String>> strings = new HashMap<>();
put(strings, "key", "a"); // ["key" => ["a"]] <-- list dynamically created
put(strings, "key", "b"); // ["key" => ["a", "b"]]
remove(strings, "key", "b"); // ["key" => ["a"]]
remove(strings, "key", "a"); // [] <-- no leftovers

您可以使用地图或列表:List@icantcodemap.putk5,Arrays.asListv3,'v4,v5@icantcode ARRAYST.asListvalue,或者根据您的版本,您可以使用List.OF。您可以有一个映射,但添加到其中的将是Map.putv3,新字符串[]{v,foo,bar};但是map.putk1,value;?它不是String[]类型。用一个元素构造一个数组啊好的,有没有比这更好的方法在Java中实现这一点,然后放置每个键,因为它们大约是8,我不认为创建一个包含所有8个键的数组是最优的?我已经编辑了答案,将映射的值作为列表包含在内。这样做会容易得多。
// Add str to list of strings indexed by key
strings.computeIfAbsent(key, ign -> new ArrayList<>()).add(str);

// Remove str from list of strings indexed by key
strings.computeIfPresent(key, (i, c) -> c.remove(str) && c.isEmpty() ? null : c);
Map<String, List<String>> strings = new HashMap<>();
put(strings, "key", "a"); // ["key" => ["a"]] <-- list dynamically created
put(strings, "key", "b"); // ["key" => ["a", "b"]]
remove(strings, "key", "b"); // ["key" => ["a"]]
remove(strings, "key", "a"); // [] <-- no leftovers