更新HashMap的现有密钥

时间:2019-06-28 09:44:53

标签: java android kotlin concurrency hashmap

我有长度为3的HashMap

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 个答案:

答案 0 :(得分:1)

编辑:这里与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 Object,因此我将使用以下流: 评论是内联

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

答案 1 :(得分:1)

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}

答案 2 :(得分:1)

另一种方法是使用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)
}