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

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

  •  
  •   13192262269 · 247 天前 · 3328 次点击
    这是一个创建于 247 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    无法预先知道就只能遍历,然后找到 obj[?] 这种格式的 key,
    建议不要修改原来的 map,而是添加到新的 map2
        3
    fansangg   247 天前
    debug,然后 setvalue,完美。
        4
    notreami   247 天前   ♥ 1
    空间换时间,再 new Map 来保存新数据
        5
    luozic   247 天前 via iPhone
    copyonwrite
        6
    winglight2016   247 天前
    new 个 map 吧,java 没有 python 里面的 rename 这种方法,所以即使有 apply 这种方法也没法直接改名
        7
    bk201   247 天前
    rename 的方法无非就是复制然后 rm old
        8
    qiyuey   247 天前 via Android
    kotlin 是支持的,可以 mapKey
        9
    passerbytiny   247 天前
    你这个 key 最多是 java.lang.Object 类型的,在转换的时候要检测和转换类型的,在这大麻烦的前提下,entrySet 迭代根本算不上麻烦。
        10
    wysnylc   247 天前
    java8 parallel stream
        12
    top1ms   246 天前
    推荐你学习 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);
    }
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1552 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 00:35 · PVG 08:35 · LAX 16:35 · JFK 19:35
    ♥ Do have faith in what you're doing.