我有一个Map,其中键是字符串,值是逗号分隔的值列表。
我如何才能逆转键/值对的顺序,并分配给新Map,使键成为值,值成为键
所以:
key value
key1 value1,value2,value3
key2 value1,value4,value5
key3 value4,value2,value1
变成:
key value
value1 key1,key2,key3
value2 key1,key3
value3 key1
value4 key2,key3
value5 key2
一种可能的解决方案是迭代每个值,然后迭代每个键,搜索相同的对应值。如果找到,将这个新的键/值对添加到一个新映射中。这似乎效率低下?
解决方案(使用公认的答案实施):
import java.util.HashMap;
import java.util.Map;
public class MapTransformer {
public static void main(String args[]) {
Map<String, String> m1 = new HashMap<String, String>();
m1.put("key1", "value1,value2");
m1.put("key2", "value5");
m1.put("key3", "value4,value2,value1");
Map<String, String> inverseMap = new HashMap<String, String>();
for (Map.Entry<String, String> entry : m1.entrySet()) {
for (String value : entry.getValue().split(",")) {
if (inverseMap.containsKey(value))
inverseMap.put(value, inverseMap.get(value) + "," + entry.getKey());
else
inverseMap.put(value, entry.getKey());
}
}
for (Map.Entry<String, String> entry : inverseMap.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+" "+value);
}
}
}
你可以使用Google Guava的BiMap:
BiMap<?, ?> bimap = HashBiMap. create();
BiMap<?, ?> reverse = bimap.inverse(); // Do this only once after the BiMap has been created.
Map<String,String> initialMap = ...
Map<String,String> inverseMap = new HashMap<String,String>();
for (Map.Entry<String,String> entry: initialMap.entrySet()) {
for (String v : entry.getValue().split(",")) {
if (inverseMap.containsKey(v))
inverseMap.put(v,inverseMap.get(v)+","+entry.getKey());
else
inverseMap.put(v, entry.getKey());
}
}
请注意,这不会对反向映射中的字符串进行排序。要做到这一点,您需要通过逆映射拆分并重新连接字符串进行第二次迭代。
更好的解决方案是将数据建模为SortedMap
看来你有很多东西要映射。
这可以用
Map<K, List<V>> map1 = new LinkedHashMap<K, List<V>>();
Map<V, List<K>> map2 = new LinkedHashMap<V, List<K>>();
for (Map.Entry<K, List<V>> entry : map1.entrySet()) {
for (V v : entry.getValue()) {
List<K> list2 = map2.get(v);
if (list2 == null)
map2.put(v, list2 = new ArrayList<K>());
list2.add(entry.getKey());
}
}
问题内容: 将a转换为a 的最佳方法是什么?只是迭代所有值并将它们插入列表中,还是我忽略了某些内容? 问题答案: 假设:
在我的项目中,我动态生成json,并将其放入中注意:键是动态的,所以我的响应如下所示: 但我预期的反应是: 如何在泽西取得预期的结果。pom.xml 如有任何帮助,我们将不胜感激!!!!
我有一个实体 我想根据货币计算每个部门的金额,并将结果写在行中。例子: 结果:“莫斯科200美元,巴黎100美元,莫斯科200卢布” 对于it: 我收到一个结果: 但我不知道如何转换地图
考虑到类有三个字段name(String)、age(int)、salary(double)。 我想创建一个名为键,值为工资的映射(而不是对象本身),如果键不唯一,则使用linkedList保存所有重复键的值。 如何实现这种场景?
问题内容: 我有一个同时包含键和值的字符串的Map。 数据如下: 我想根据其键对地图进行排序。因此,最后,我将拥有..依此类推。 最终,我试图从该Map中获取两个字符串。 第一个字符串:问题(顺序为1 ..10) 第二个字符串:答案(与问题的顺序相同) 现在,我有以下内容: 这使我的问题成串出现,但顺序不正确。 问题答案: 简短答案 使用。这正是它的目的。 如果将此地图传递给你,并且你无法确定类型
我需要使用jolt spec在JSON中将(多个)键转换为值,将值转换为键。做这件事的正确规范应该是什么? 输入: 所需输出: