V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
13192262269
V2EX  ›  程序员

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

  •  
  •   13192262269 · Apr 10, 2019 · 8980 views
    This topic created in 2581 days ago, the information mentioned may be changed or developed.

    如题: 例如我一个 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 replies    2019-04-11 11:14:13 +08:00
    gosansam
        1
    gosansam  
       Apr 10, 2019
    除了迭代器,其他循环方式修改数据会报错的,entrySet 迭代器也不麻烦啊
    TommyLemon
        2
    TommyLemon  
       Apr 10, 2019
    明确知道 key 的名称的话,直接
    map.put("A", map.remove("obj[A]"))

    无法预先知道就只能遍历,然后找到 obj[?] 这种格式的 key,
    建议不要修改原来的 map,而是添加到新的 map2
    fansangg
        3
    fansangg  
       Apr 10, 2019
    debug,然后 setvalue,完美。
    notreami
        4
    notreami  
       Apr 10, 2019   ❤️ 1
    空间换时间,再 new Map 来保存新数据
    luozic
        5
    luozic  
       Apr 10, 2019 via iPhone
    copyonwrite
    winglight2016
        6
    winglight2016  
       Apr 10, 2019
    new 个 map 吧,java 没有 python 里面的 rename 这种方法,所以即使有 apply 这种方法也没法直接改名
    bk201
        7
    bk201  
       Apr 10, 2019
    rename 的方法无非就是复制然后 rm old
    qiyuey
        8
    qiyuey  
       Apr 10, 2019 via Android
    kotlin 是支持的,可以 mapKey
    passerbytiny
        9
    passerbytiny  
       Apr 10, 2019
    你这个 key 最多是 java.lang.Object 类型的,在转换的时候要检测和转换类型的,在这大麻烦的前提下,entrySet 迭代根本算不上麻烦。
    wysnylc
        10
    wysnylc  
       Apr 10, 2019
    java8 parallel stream
    ZEOH
        11
    ZEOH  
       Apr 10, 2019
    top1ms
        12
    top1ms  
       Apr 11, 2019
    推荐你学习 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);
    }
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   819 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 19:28 · PVG 03:28 · LAX 12:28 · JFK 15:28
    ♥ Do have faith in what you're doing.