最近遇到个关于Map的有意思的问题,给大家分享下,看看有没有更好的思路

追云者 2019-06-22 03:46:08
有两个Map,map1和map2。

map2里的key和和map1里的key有同名的,如:
map1:
keyName1 : "value1"
map2:
keyName1 : "value2"

现在需要把map1的key名换成map2里相同key名的key对应的value值。如:
上面的map1转换后的结果:
map1:
value2: "value1"

补充: map1、map2里可能还有嵌套的子map。

请问大家有没有啥好的思路?
...全文
265 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
冲上云霄 、 2019-06-24
  • 打赏
  • 举报
回复
引用 9 楼 qq_39936465 的回复:
[quote=引用 8 楼 一只小菜鸟i 的回复:] 方法是不错的,不过跟楼主想要的结果好像不太一样
map1: value2:value1 和 map2: value1:value2 其实就是变量名的关系,原理是一样的啊![/quote] 哈哈哈,所以我说你的方法不错的
qq_39936465 2019-06-24
  • 打赏
  • 举报
回复
引用 8 楼 一只小菜鸟i 的回复:
方法是不错的,不过跟楼主想要的结果好像不太一样
map1: value2:value1 和 map2: value1:value2 其实就是变量名的关系,原理是一样的啊!
冲上云霄 、 2019-06-24
  • 打赏
  • 举报
回复
引用 6 楼 qq_39936465 的回复:
换key名也一样,添加完删除以前键和值 Set<String> s = map1.keySet(); for (String str : s) { if (map2.containsKey(str)) { map2.put(map1.get(str), map2.get(str)); map2.remove(str); } } [/code] 运行结果:

key=张飞------->value=翼德
key=刘备------->value=玄德
key=赵云------->value=常山赵子龙
----------------------------
key=子龙------->value=常山赵子龙
key=刘备------->value=玄德
key=燕人------->value=翼德

方法是不错的,不过跟楼主想要的结果好像不太一样
冲上云霄 、 2019-06-24
  • 打赏
  • 举报
回复
引用 3 楼 落笔云 的回复:
写了个小demo,可以参考一下,不过感觉过程很繁琐,如果找到好一点的方法请告知,万分感谢 public static void main(String[] args) { boolean f = true; int count = 0; // 初始化 Map<String, String> map1 = new HashMap<String, String>(); Map<String, String> map11 = new HashMap<String, String>();//map Map<String, String> map2 = new HashMap<String, String>(); map1.put("关羽", "云长"); map1.put("赵云", "子龙"); map1.put("周瑜", "公瑾"); map1.put("张飞", "燕人"); map2.put("刘备", "玄德"); map2.put("赵云", "常山赵子龙"); map2.put("张飞", "翼德"); // 记录重复数据,然后将map1的key作为value,map2value作为key Map<String, String> map3 = new HashMap<String, String>(); map11 = map1; System.out.println("开始=============="); // 嵌套循环进行比对 for (Map.Entry<String, String> m : map1.entrySet()) { String map1key = m.getKey(); String map1value = m.getValue(); for (Map.Entry<String, String> n : map2.entrySet()) { String map2key = n.getKey(); String map2value = n.getValue(); if (map1key == map2key) { // 进行记录 map3.put(map2value, map1key); } } } System.out.println(map1.toString() + "map1"); System.out.println(map2.toString() + "map2"); System.out.println(map3.toString() + "map3"); Iterator<Map.Entry<String, String>> iterator = map11.entrySet().iterator(); String map1value = ""; String map2value = ""; String cf = ""; do { count = 0; while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); System.out.println(entry.getKey() + " " + entry.getValue()); for (String m : map3.values()) { System.out.println(map3.values() + "bbbb"); System.out.println(entry.getKey() + "aaaa"); if (m.equals(entry.getKey())) { System.out.println("开始进行修改"+m); // 先将原来的map1 value拿到 map1value = map1.get(m); map2value = map2.get(m); cf = m; count++; break; } } } // map1.添加元素 map1.put(map2value, map1value); // 删除原来的map1重复元素 Iterator<String> iterator1 = map1.keySet().iterator();// map中key(键)的迭代器对象 while (iterator1.hasNext()) {// 循环取键值进行判断 String key = iterator1.next();// 键 if (key.equals(cf)) { iterator1.remove();// 移除map中以a字符开头的键对应的键值对 } } //删除map3已经修改过的 Iterator<String> map3it = map3.keySet().iterator();// map中key(键)的迭代器对象 while (map3it.hasNext()) {// 循环取键值进行判断 String key = map3it.next();// 键 if (key.equals(cf)) { map3it.remove();// 移除map中以a字符开头的键对应的键值对 } } System.out.println(count+"count"); //判断是否还存在未修改的元素 if (count == 0) { f = false; } } while (f == true); System.out.println(map1.toString()); }
辛苦辛苦,好深奥。 class Demo2{ public static void main(String[] args) { Map<String,Object> map1 = new HashMap<>(); Map<String,Object> map2 = new HashMap<>(); map1.put("1",1); map1.put("2",2); map1.put("3",3); map2.put("1",11); map2.put("4",4); map2.put("5",5); System.out.println("替换前"); for (String o : map1.keySet()) { System.out.println(o + "----" + map1.get(o)); } System.out.println("-------------------"); for (String o : map2.keySet()) { System.out.println(o + "----" + map2.get(o)); } Object o = null; String s2 = null; for (String s : map1.keySet()) { for (String s1 : map2.keySet()) { if(s.equals(s1)){ o = map2.get(s1); s2 = s; } } } map1.put(String.valueOf(o),map1.get(s2)); map1.remove(s2); System.out.println("替换后"); for (String s : map1.keySet()) { System.out.println(s + "---" + map1.get(s)); } } }
qq_39936465 2019-06-24
  • 打赏
  • 举报
回复
换key名也一样,添加完删除以前键和值 Set<String> s = map1.keySet(); for (String str : s) { if (map2.containsKey(str)) { map2.put(map1.get(str), map2.get(str)); map2.remove(str); } } [/code] 运行结果:

key=张飞------->value=翼德
key=刘备------->value=玄德
key=赵云------->value=常山赵子龙
----------------------------
key=子龙------->value=常山赵子龙
key=刘备------->value=玄德
key=燕人------->value=翼德

qq_39936465 2019-06-24
  • 打赏
  • 举报
回复
引用 3 楼 落笔云 的回复:
写了个小demo,可以参考一下,不过感觉过程很繁琐,如果找到好一点的方法请告知,万分感谢
完全没必要,可以用set把map1的key全部放入set数列,然后用containsKey来比对map2是否存在该key,存在的对map2的key进行再次put

public class test2 {
	public static void main(String[] args) {
		// 初始化
		Map<String, String> map1 = new HashMap<String, String>();
		Map<String, String> map2 = new HashMap<String, String>();
		map1.put("关羽", "云长");
		map1.put("赵云", "子龙");
		map1.put("周瑜", "公瑾");
		map1.put("张飞", "燕人");
		map2.put("刘备", "玄德");
		map2.put("赵云", "常山赵子龙");
		map2.put("张飞", "翼德");
		//替换前
		Iterator<String> it1 = map2.keySet().iterator();
		while (it1.hasNext()) {
			String key = it1.next();
			System.out.println("key=" + key + "------->" + "value=" + map2.get(key));
		}
		Set<String> s = map1.keySet();
		for (String str : s) {
			if (map2.containsKey(str)) {
				map2.put(str, map1.get(str));
			}
		}
		System.out.println("----------------------------");
		//替换后
		Iterator<String> it2 = map2.keySet().iterator();
		while (it2.hasNext()) {
			String key = it2.next();
			System.out.println("key=" + key + "------->" + "value=" + map2.get(key));

		}
	}
}

运行结果:

key=张飞------->value=翼德
key=刘备------->value=玄德
key=赵云------->value=常山赵子龙
----------------------------
key=张飞------->value=燕人
key=刘备------->value=玄德
key=赵云------->value=子龙
咸哼酒家 2019-06-22
  • 打赏
  • 举报
回复
楼上真辛苦,写了这么多代码,要是能把map的key和value换成object就更好了
落笔云 2019-06-22
  • 打赏
  • 举报
回复
写了个小demo,可以参考一下,不过感觉过程很繁琐,如果找到好一点的方法请告知,万分感谢 public static void main(String[] args) { boolean f = true; int count = 0; // 初始化 Map<String, String> map1 = new HashMap<String, String>(); Map<String, String> map11 = new HashMap<String, String>();//map Map<String, String> map2 = new HashMap<String, String>(); map1.put("关羽", "云长"); map1.put("赵云", "子龙"); map1.put("周瑜", "公瑾"); map1.put("张飞", "燕人"); map2.put("刘备", "玄德"); map2.put("赵云", "常山赵子龙"); map2.put("张飞", "翼德"); // 记录重复数据,然后将map1的key作为value,map2value作为key Map<String, String> map3 = new HashMap<String, String>(); map11 = map1; System.out.println("开始=============="); // 嵌套循环进行比对 for (Map.Entry<String, String> m : map1.entrySet()) { String map1key = m.getKey(); String map1value = m.getValue(); for (Map.Entry<String, String> n : map2.entrySet()) { String map2key = n.getKey(); String map2value = n.getValue(); if (map1key == map2key) { // 进行记录 map3.put(map2value, map1key); } } } System.out.println(map1.toString() + "map1"); System.out.println(map2.toString() + "map2"); System.out.println(map3.toString() + "map3"); Iterator<Map.Entry<String, String>> iterator = map11.entrySet().iterator(); String map1value = ""; String map2value = ""; String cf = ""; do { count = 0; while (iterator.hasNext()) { Map.Entry<String, String> entry = iterator.next(); System.out.println(entry.getKey() + " " + entry.getValue()); for (String m : map3.values()) { System.out.println(map3.values() + "bbbb"); System.out.println(entry.getKey() + "aaaa"); if (m.equals(entry.getKey())) { System.out.println("开始进行修改"+m); // 先将原来的map1 value拿到 map1value = map1.get(m); map2value = map2.get(m); cf = m; count++; break; } } } // map1.添加元素 map1.put(map2value, map1value); // 删除原来的map1重复元素 Iterator<String> iterator1 = map1.keySet().iterator();// map中key(键)的迭代器对象 while (iterator1.hasNext()) {// 循环取键值进行判断 String key = iterator1.next();// 键 if (key.equals(cf)) { iterator1.remove();// 移除map中以a字符开头的键对应的键值对 } } //删除map3已经修改过的 Iterator<String> map3it = map3.keySet().iterator();// map中key(键)的迭代器对象 while (map3it.hasNext()) {// 循环取键值进行判断 String key = map3it.next();// 键 if (key.equals(cf)) { map3it.remove();// 移除map中以a字符开头的键对应的键值对 } } System.out.println(count+"count"); //判断是否还存在未修改的元素 if (count == 0) { f = false; } } while (f == true); System.out.println(map1.toString()); }
落笔云 2019-06-22
  • 打赏
  • 举报
回复
上面的如何打错了,是想打 “再和“,别在意
落笔云 2019-06-22
  • 打赏
  • 举报
回复
遍历的时候不能对正在遍历的map进行修改,在不考虑性能的情况下,建议对map1进行备份。如何遍历备份的进行比对,再在原来的map1上面进行修改,这样可以避免java.util.ConcurrentModificationException

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧