如果一个hashMap,它的Key默认都是小写,现在有一个Key包含了大写字母,要将这个Key改为小写,怎么办?(将key里面的小写改为大写,自行类比)
创建一个如题的map,代码:
HashMap<String, String> map = new HashMap<String, String>();
("name", "jack");
("age", "10");
("Gender", "male");
此时就是要将"Gender"这个key,改为"gender";
首先我们必然是要遍历map,得到每一个entry,以便取到key和value;
但是问题在于,我们然后将这个key用toLowerCase()改成小写就可以了吗?答案是否定的;
for (Entry<String,String> entry : ()) {
String key = ();
String value = ();
if (!(())) { //简单方法判断字母格式的字符串是否包含大写,反之判断是否包含小写就用 !(())
key = ();
(key); //此时打印这个局部变量key,确实是变成小写的gender了,但是在循环外这个map的key并没有发生变化
}
}
其实在map中,是不允许对key进行修改的,原因是一旦修改了key的大小写,那么这个key的hash值就发生了变化;
所以为了不影响原key的hash值,我们可以新建一个map,来存储改为小写的key和value(当然,还包含原map中其他键值对);
HashMap<String, String> newMap = new HashMap<String, String>();
for (Entry<String,String> entry : ()) {
String key = ();
String value = ();
if (!(())) {
String newKey = ();
(newKey, value);
}else {
(key, value);
}
}
此时再遍历newMap,就会发现所有的key都是小写了(当然,原来的map其实是没有动的);
附完整代码:
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String, String>();
("name", "jack");
("age", "10");
("Gender", "male");
HashMap<String, String> newMap = new HashMap<String, String>();
for (Entry<String,String> entry : ()) {
String key = ();
String value = ();
if (!(())) { //此处不判断是否包含大写,而直接全部转为小写亦可
String newKey = ();
(newKey, value);
}else {
(key, value);
}
}
//以下是遍历map进行测试结果
//遍历原map,key还是包含大写的
for (Entry<String,String> entry : ()) {
String key = ();
String value = ();
(key + "," + value);
}
("-------------");
//遍历newMap,key是不包含小写的
for (Entry<String,String> entry : ()) {
String key = ();
String value = ();
(key + "," + value);
}
}
附通用方法:
public static Map<String, String> transferToLowerCase(
Map<String, String> orgMap) {
Map<String, String> resultMap = new HashMap<>();
if (orgMap == null || ()) {
return resultMap;
}
Set<Entry<String,String>> entrySet = ();
for (Entry<String, String> entry : entrySet) {
String key = ();
String value = ();
((), value);
}
return resultMap;
}