为了账号安全,请及时绑定邮箱和手机立即绑定

更新 HashMap 的现有键

更新 HashMap 的现有键

BIG阳 2023-02-23 11:12:49
我有长度为 3 的 HashMap < Integer,String>:1=>"Value1"2=>"Value2"3=>"Value3"现在我想将所有键减 1(如果键>1): 输出:1=>"Value2"2=>"Value3"我在尝试什么  for (e in hashMap.entries) {                                val entry = e as Map.Entry<*, *>                                var keyPos = (entry.key as Int)                                if (keyPos != -1) {                                    if (keyPos > 1) {                                        keyPos = keyPos - 1                                        if (keyPos != -1) {                                            hashMap.put(keyPos, entry.value as String?)                                        }                                    }                                }                            }但它没有提供所需的输出。如何使其在没有并发异常的情况下工作。
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

另一种方法是使用mapKeys扩展函数,它允许您重新定义映射条目的键:

fun main() {

    val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")

    val updatedMap = originalMap

        .mapKeys {

            if (it.key > 1) {

                it.key - 1

            } else {

                it.key

            }

        }


    println(updatedMap) // prints: {1=value2, 2=value3}

}

请注意,这不会就地更新地图,但会创建一个新地图。另请注意:

如果任何两个条目映射到相同的键,则后一个的值将覆盖与前一个关联的值。

这意味着如果两个键发生冲突,通常您无法知道哪个会“获胜”(除非您使用的是LinkedHashMap,它保留了插入顺序)。

更通用的方法是:

  1. 递减所有键

  2. 过滤掉所有非正键

不过,这将需要 2 次完整迭代(除非您使用Sequences,它是惰性求值的):

fun main() {

    val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")

    val updatedMap = originalMap

        .mapKeys {

            it.key - 1

        }.filter {

            it.key > 0

        }


    println(updatedMap)

}


查看完整回答
反对 回复 2023-02-23
?
守着一只汪

TA贡献1872条经验 获得超4个赞

这里与 Java 7 兼容代码相同(无流)


HashMap<Integer, String> hashMap = new HashMap<>();

hashMap.put(1, "test1");

hashMap.put(2, "test2");

hashMap.put(3, "test3");


Map<Integer, String> yourNewHashMap = new HashMap<>();

for (final Map.Entry<Integer, String> entry : hashMap.entrySet()) {

    if (entry.getKey() != 1) { // make sure index 1 is omitted

        yourNewHashMap.put(entry.getKey() - 1, entry.getValue()); // decrease the index for each key/value pair and add it to the new map

    }

}

流的旧答案:


由于新的 Map 对象对你来说没问题,我会使用以下流:评论是内联的


HashMap<Integer, String> hashMap = new HashMap<>();

hashMap.put(1, "test1");

hashMap.put(2, "test2");

hashMap.put(3, "test3");


// use this

Map<Integer, String> yourNewHashMap = hashMap.entrySet().stream()

                                       .filter(es -> es.getKey() != 1) // make sure index 1 is omitted

                                       .map(es -> new AbstractMap.SimpleEntry<Integer, String>(es.getKey() - 1, es.getValue())) // decrease the index for each key/value pair

                                       .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); // create a new map



查看完整回答
反对 回复 2023-02-23
?
偶然的你

TA贡献1841条经验 获得超3个赞

public static void main(String[] args) {

    HashMap<Integer, String> map = new HashMap<>();


    // Populate the HashMap

    map.put(1, "Value1");

    map.put(2, "Value2");

    map.put(3, "Value3");

    System.out.println("Original HashMap: "

            + map); 

    decreaseAllKeysByOne(map);

}


private static void decreaseAllKeysByOne(HashMap<Integer, String> map) {

    // Add your condition (if key>1)

    HashMap<Integer, String> newMap = new HashMap<>();

    map.remove(1);



    Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();

    int i = 1;

    while (iterator.hasNext()) {

        Map.Entry<Integer, String> entry = iterator.next();

        newMap.put(i, entry.getValue());

        i++;

    }

    System.out.println("Modified HashMap: "

            + newMap);

}

输出 :


原始 HashMap:{1=Value1, 2=Value2, 3=Value3}


修改后的 HashMap:{1=Value2, 2=Value3}


查看完整回答
反对 回复 2023-02-23
  • 3 回答
  • 0 关注
  • 243 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号