如题: 例如我一个 map 集合是这样的:
key value
obj[A] 000
obj[B] 111
obj[C] 222
DDD 333
现在我想要变成这样:
key value
A 000
B 111
C 222
DDD 333
有什么比较快的方法吗,我目前只会用 entrySet 迭代的方法 感觉比较麻烦
1
gosansam 2019-04-10 16:02:23 +08:00
除了迭代器,其他循环方式修改数据会报错的,entrySet 迭代器也不麻烦啊
|
2
TommyLemon 2019-04-10 17:06:14 +08:00
明确知道 key 的名称的话,直接
map.put("A", map.remove("obj[A]")) 无法预先知道就只能遍历,然后找到 obj[?] 这种格式的 key, 建议不要修改原来的 map,而是添加到新的 map2 |
3
fansangg 2019-04-10 17:08:43 +08:00
debug,然后 setvalue,完美。
|
4
notreami 2019-04-10 17:25:11 +08:00 1
空间换时间,再 new Map 来保存新数据
|
5
luozic 2019-04-10 17:40:57 +08:00 via iPhone
copyonwrite
|
6
winglight2016 2019-04-10 18:05:40 +08:00
new 个 map 吧,java 没有 python 里面的 rename 这种方法,所以即使有 apply 这种方法也没法直接改名
|
7
bk201 2019-04-10 18:08:47 +08:00
rename 的方法无非就是复制然后 rm old
|
8
qiyuey 2019-04-10 18:12:16 +08:00 via Android
kotlin 是支持的,可以 mapKey
|
9
passerbytiny 2019-04-10 18:17:34 +08:00
你这个 key 最多是 java.lang.Object 类型的,在转换的时候要检测和转换类型的,在这大麻烦的前提下,entrySet 迭代根本算不上麻烦。
|
10
wysnylc 2019-04-10 19:00:13 +08:00
java8 parallel stream
|
11
ZEOH 2019-04-10 19:02:08 +08:00
[BiMap<K, V>]( https://google.github.io/guava/releases/18.0/api/docs/com/google/common/collect/BiMap.html) from Google Guava
|
12
top1ms 2019-04-11 11:14:13 +08:00
推荐你学习 Java8 lambda 表达式
测试案例如下: @Test public void test02(){ Map<String,Integer> map=new HashMap<>(); map.put("zhangsan",123); map.put("lisi",123); map.put("wangmazi",123); Map<String,Integer> keyMap=map.entrySet() .stream() .collect(toMap(castKey().compose(Map.Entry::getKey),Map.Entry::getValue)); keyMap.entrySet().forEach(System.out::println); } /** * @Author: zms * @Description: 转换成一个 function * @Date: Create on 2019/4/11 10:57 */ private Function<String, String> castKey() { return this::opsForKey; } /** * @Author: zms * @Description: key 转换规则 默认保留自己自己的自己实现 * @Date: Create on 2019/4/11 10:59 */ private String opsForKey(String key){ //do something ... //我这里直接就截取原始 key 值的第一位当作新 key 了吼 // 看你的规则 正则拿出大写字母就 ok 了 return key.substring(0, 1); } |