V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
13192262269
V2EX  ›  程序员

请教 Java 如何更改 map 里面的 key

  •  
  •   13192262269 · 2019-04-10 15:54:55 +08:00 · 8226 次点击
    这是一个创建于 2061 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题: 例如我一个 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 迭代的方法 感觉比较麻烦

    12 条回复    2019-04-11 11:14:13 +08:00
    gosansam
        1
    gosansam  
       2019-04-10 16:02:23 +08:00
    除了迭代器,其他循环方式修改数据会报错的,entrySet 迭代器也不麻烦啊
    TommyLemon
        2
    TommyLemon  
       2019-04-10 17:06:14 +08:00
    明确知道 key 的名称的话,直接
    map.put("A", map.remove("obj[A]"))

    无法预先知道就只能遍历,然后找到 obj[?] 这种格式的 key,
    建议不要修改原来的 map,而是添加到新的 map2
    fansangg
        3
    fansangg  
       2019-04-10 17:08:43 +08:00
    debug,然后 setvalue,完美。
    notreami
        4
    notreami  
       2019-04-10 17:25:11 +08:00   ❤️ 1
    空间换时间,再 new Map 来保存新数据
    luozic
        5
    luozic  
       2019-04-10 17:40:57 +08:00 via iPhone
    copyonwrite
    winglight2016
        6
    winglight2016  
       2019-04-10 18:05:40 +08:00
    new 个 map 吧,java 没有 python 里面的 rename 这种方法,所以即使有 apply 这种方法也没法直接改名
    bk201
        7
    bk201  
       2019-04-10 18:08:47 +08:00
    rename 的方法无非就是复制然后 rm old
    qiyuey
        8
    qiyuey  
       2019-04-10 18:12:16 +08:00 via Android
    kotlin 是支持的,可以 mapKey
    passerbytiny
        9
    passerbytiny  
       2019-04-10 18:17:34 +08:00
    你这个 key 最多是 java.lang.Object 类型的,在转换的时候要检测和转换类型的,在这大麻烦的前提下,entrySet 迭代根本算不上麻烦。
    wysnylc
        10
    wysnylc  
       2019-04-10 19:00:13 +08:00
    java8 parallel stream
    ZEOH
        11
    ZEOH  
       2019-04-10 19:02:08 +08:00
    top1ms
        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);
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2471 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:52 · PVG 23:52 · LAX 07:52 · JFK 10:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.