更新 HashMap 的现有键

我有长度为 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?)

                                        }

                                    }

                                }

                            }

但它没有提供所需的输出。


如何使其在没有并发异常的情况下工作。


BIG阳
浏览 315回答 3
3回答

鸿蒙传说

另一种方法是使用mapKeys扩展函数,它允许您重新定义映射条目的键:fun main() {&nbsp; &nbsp; val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")&nbsp; &nbsp; val updatedMap = originalMap&nbsp; &nbsp; &nbsp; &nbsp; .mapKeys {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (it.key > 1) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.key - 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.key&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; println(updatedMap) // prints: {1=value2, 2=value3}}请注意,这不会就地更新地图,但会创建一个新地图。另请注意:如果任何两个条目映射到相同的键,则后一个的值将覆盖与前一个关联的值。这意味着如果两个键发生冲突,通常您无法知道哪个会“获胜”(除非您使用的是LinkedHashMap,它保留了插入顺序)。更通用的方法是:递减所有键过滤掉所有非正键不过,这将需要 2 次完整迭代(除非您使用Sequences,它是惰性求值的):fun main() {&nbsp; &nbsp; val originalMap = mapOf(1 to "value1", 2 to "value2", 3 to "value3")&nbsp; &nbsp; val updatedMap = originalMap&nbsp; &nbsp; &nbsp; &nbsp; .mapKeys {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.key - 1&nbsp; &nbsp; &nbsp; &nbsp; }.filter {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.key > 0&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; println(updatedMap)}

守着一只汪

这里与 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()) {&nbsp; &nbsp; if (entry.getKey() != 1) { // make sure index 1 is omitted&nbsp; &nbsp; &nbsp; &nbsp; yourNewHashMap.put(entry.getKey() - 1, entry.getValue()); // decrease the index for each key/value pair and add it to the new map&nbsp; &nbsp; }}流的旧答案:由于新的 Map 对象对你来说没问题,我会使用以下流:评论是内联的HashMap<Integer, String> hashMap = new HashMap<>();hashMap.put(1, "test1");hashMap.put(2, "test2");hashMap.put(3, "test3");// use thisMap<Integer, String> yourNewHashMap = hashMap.entrySet().stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.filter(es -> es.getKey() != 1) // make sure index 1 is omitted&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.map(es -> new AbstractMap.SimpleEntry<Integer, String>(es.getKey() - 1, es.getValue())) // decrease the index for each key/value pair&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue)); // create a new map

偶然的你

public static void main(String[] args) {&nbsp; &nbsp; HashMap<Integer, String> map = new HashMap<>();&nbsp; &nbsp; // Populate the HashMap&nbsp; &nbsp; map.put(1, "Value1");&nbsp; &nbsp; map.put(2, "Value2");&nbsp; &nbsp; map.put(3, "Value3");&nbsp; &nbsp; System.out.println("Original HashMap: "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + map);&nbsp;&nbsp; &nbsp; decreaseAllKeysByOne(map);}private static void decreaseAllKeysByOne(HashMap<Integer, String> map) {&nbsp; &nbsp; // Add your condition (if key>1)&nbsp; &nbsp; HashMap<Integer, String> newMap = new HashMap<>();&nbsp; &nbsp; map.remove(1);&nbsp; &nbsp; Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();&nbsp; &nbsp; int i = 1;&nbsp; &nbsp; while (iterator.hasNext()) {&nbsp; &nbsp; &nbsp; &nbsp; Map.Entry<Integer, String> entry = iterator.next();&nbsp; &nbsp; &nbsp; &nbsp; newMap.put(i, entry.getValue());&nbsp; &nbsp; &nbsp; &nbsp; i++;&nbsp; &nbsp; }&nbsp; &nbsp; System.out.println("Modified HashMap: "&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + newMap);}输出 :原始 HashMap:{1=Value1, 2=Value2, 3=Value3}修改后的 HashMap:{1=Value2, 2=Value3}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java