我有长度为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?)
}
}
}
}
但是它没有提供所需的输出。
如何使其在没有并发异常的情况下工作。
答案 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
,它会保留插入顺序)。
更通用的方法是:
但是,这将需要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)
}