Java基于HashMap排序值提取对应键的方法返回null问题求助
问题定位
- 核心循环条件书写错误,导致逻辑完全不执行
匹配键的循环写法为for (int i=0; i >= n-1; i++):i初始值为0,判断条件要求i必须大于等于n-1,当n为大于1的正整数时,n-1≥1,0 >=1的判断结果为false,循环体从一开始就不会运行。这就是System.out.println(entry.getKey());无输出、maxItems数组填充为空的直接原因。 - 冒泡排序方向与取值目标不匹配
原有冒泡逻辑在maxArray[j] > maxArray[j+1]时交换元素,最终得到升序排列的数组,即最小值在数组开头、最大值在数组末尾。若目标是提取前N个最大值,该排序顺序下从数组开头取到的实际是最小的N个值,逻辑完全反向。 - 同值键的匹配逻辑存在缺陷
当HashMap中存在多个键对应相同value时,直接通过value反查键的逻辑会出现反复赋值、键错配的问题:同值的所有键都会命中判断,同一个maxItems[i]位置会被反复覆盖赋值。 - 存在无实际作用的冗余代码
单独调用itemCount.values().toArray();但未接收返回值、声明maxIndex变量后从未使用,这两行代码不参与任何业务逻辑,属于无效执行。
修正实现
调整排序方向为降序、修正循环进入条件、增加边界校验、避免同值匹配覆盖后的代码如下:
public String[] getMaxListAlt(int n, HashMap<String, Integer> itemCount) { // 边界校验,避免空指针、数组长度越界 if (n <= 0 || itemCount == null || itemCount.isEmpty()) { return new String[0]; } int validLength = Math.min(n, itemCount.size()); // 提取值数组 Integer[] maxArray = itemCount.values().toArray(new Integer[0]); int arrLen = maxArray.length; // 降序冒泡排序:值越大越靠前,方便直接取前N个最大值 for (int i = 0; i < arrLen - 1; i++) { for (int j = 0; j < arrLen - i - 1; j++) { if (maxArray[j] < maxArray[j + 1]) { int temp = maxArray[j]; maxArray[j] = maxArray[j + 1]; maxArray[j + 1] = temp; } } } String[] maxItems = new String[validLength]; // 修正循环条件:从0遍历到validLength-1,确保循环正常执行 for (int i = 0; i < validLength; i++) { int targetVal = maxArray[i]; for (Map.Entry<String, Integer> entry : itemCount.entrySet()) { if (entry.getValue().equals(targetVal)) { System.out.println(entry.getKey()); maxItems[i] = entry.getKey(); // 匹配成功后移除对应entry,避免相同值的键重复匹配 itemCount.remove(entry.getKey(), entry.getValue()); break; } } } // 打印排序结果做验证 for (int counts : maxArray) { System.out.println(counts); } return maxItems; }
内容的提问来源于stack exchange,提问作者Jack Goodwin
相关产品推荐
相关产品推荐

