• 请不要在回答技术问题时复制粘贴 AI 生成的内容
13192262269
V2EX  ›  程序员

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

  •  
  •   13192262269 · Apr 10, 2019 · 9638 views
    This topic created in 2771 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
    gosansam
    Apr 10, 2019
    1
    除了迭代器,其他循环方式修改数据会报错的,entrySet 迭代器也不麻烦啊
    TommyLemon
    TommyLemon
    Apr 10, 2019
    2
    明确知道 key 的名称的话,直接
    map.put("A", map.remove("obj[A]"))

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