能否仅迭代HashMap中半数条目并修改其值为‘-’?
如何仅迭代HashMap中的半数条目并修改值?
首先要明确:p.keySet()/2这种写法完全错误,Java集合不支持直接做除法运算。另外需要注意,默认的HashMap是无序的,它不会维护条目的插入顺序,所以你说的“前两个”在普通HashMap中没有固定定义——每次迭代的顺序可能都不一样。如果需要保证修改的是插入顺序的前半数条目,建议改用LinkedHashMap,它会严格维护元素的插入顺序。
下面给出几种可行的实现方式:
方式一:修改迭代顺序中的前半数条目(普通HashMap)
这种方式会修改迭代时遇到的前半数条目,但顺序不固定:
HashMap<String, String> p = new HashMap<>(); p.put("A", "100"); p.put("B", "400"); p.put("C", "600"); p.put("D", "845"); // 计算需要修改的条目数量 int halfSize = p.size() / 2; int count = 0; // 使用迭代器控制遍历次数 Iterator<String> keyIterator = p.keySet().iterator(); while (keyIterator.hasNext() && count < halfSize) { String key = keyIterator.next(); p.replace(key, "-"); count++; } // 验证结果 p.forEach((k, v) -> System.out.printf("\"%s\", \"%s\"\n", k, v));
方式二:修改插入顺序的前半数条目(LinkedHashMap)
如果需要像你例子中那样,修改插入顺序的前两个条目,用LinkedHashMap来保证顺序:
LinkedHashMap<String, String> p = new LinkedHashMap<>(); p.put("A", "100"); p.put("B", "400"); p.put("C", "600"); p.put("D", "845"); int halfSize = p.size() / 2; int count = 0; for (String key : p.keySet()) { if (count >= halfSize) { break; } p.replace(key, "-"); count++; } // 验证结果 p.forEach((k, v) -> System.out.printf("\"%s\", \"%s\"\n", k, v));
方式三:随机修改半数条目
如果不需要固定顺序,想随机挑选半数条目修改,可以把keySet转成List后打乱,再修改前半部分:
HashMap<String, String> p = new HashMap<>(); p.put("A", "100"); p.put("B", "400"); p.put("C", "600"); p.put("D", "845"); // 将keySet转为List并打乱顺序 List<String> keyList = new ArrayList<>(p.keySet()); Collections.shuffle(keyList); int halfSize = keyList.size() / 2; for (int i = 0; i < halfSize; i++) { p.replace(keyList.get(i), "-"); } // 验证结果 p.forEach((k, v) -> System.out.printf("\"%s\", \"%s\"\n", k, v));
注意事项
- 使用
replace方法修改值不会改变HashMap的结构,所以不会触发ConcurrentModificationException,可以安全在遍历中使用。 - 如果HashMap的条目数是奇数,比如size为5,
size()/2会得到2(整数除法),只会修改前2个条目。
内容的提问来源于stack exchange,提问作者user18984687
相关产品推荐
相关产品推荐

