Java中TreeMap数组显示异常及顺序获取前k小键值对问题
解决你的有序数组最小和数对问题
嘿,我来帮你拆解下遇到的两个问题,顺便把代码修正过来:
问题1:数组显示为[I@xxxxxx而非实际值
出现这个问题有两个核心原因:
- 数组默认toString行为:Java里直接打印数组时,默认调用的是
Object.toString(),返回格式是[类型缩写@哈希值]([I代表int数组)。要看到数组的实际内容,得用Arrays.toString()方法。 - 复用同一个数组对象:你全程只创建了一个
arr_hold数组,每次循环只是修改它的元素值,但TreeMap里存储的是这个数组对象的引用。最后所有键对应的都是同一个数组,值会被最后一次赋值的[11,6]覆盖,这是个很容易踩的坑!
问题2:用value.get(k1)返回null
你这里混淆了键的含义:TreeMap的键是数对的和(比如3、5、7),而不是0、1、2这种索引值。所以用k1(0、1、2)作为键去查找,自然找不到对应的entry,返回null。
修正后的代码
我调整了代码,解决了这两个问题,同时实现了取出前k个最小和数对的需求:
import java.util.*; public class Solution { public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) { // TreeMap会自动按键(sum)升序排列 Map<Integer, List<int[]>> value = new TreeMap<>(); List<int[]> solve = new ArrayList<>(); for (int num1 : nums1) { for (int num2 : nums2) { int sum = num1 + num2; // 每次创建新数组,避免引用复用导致值覆盖 int[] pair = new int[]{num1, num2}; // 同一个sum可能对应多个数对,用List存储 value.computeIfAbsent(sum, key -> new ArrayList<>()).add(pair); } } // 遍历有序的TreeMap,取前k个数对 int count = 0; for (Map.Entry<Integer, List<int[]>> entry : value.entrySet()) { for (int[] pair : entry.getValue()) { if (count >= k) { return solve; } solve.add(pair); count++; } } return solve; } public static void main(String[] args) { Solution solution = new Solution(); int[] nums1 = {1,7,11}; int[] nums2 = {2,4,6}; List<int[]> result = solution.kSmallestPairs(nums1, nums2, 3); // 格式化打印结果,显示数组实际内容 for (int[] pair : result) { System.out.printf("{%d+%d=%d}%n", pair[0], pair[1], pair[0]+pair[1]); } } }
关键修改点说明
- 把
Map<Integer, int[]>改成Map<Integer, List<int[]>>:避免相同和的数对被覆盖(比如不同数对可能算出相同的sum)。 - 每次循环创建新的
int[] pair:彻底解决数组引用复用导致的数值覆盖问题。 - 遍历TreeMap的entrySet取前k个元素:利用TreeMap的有序性,按sum从小到大取数对,直到取够k个。
- 打印时用格式化输出替代直接打印数组,清晰展示数对内容。
内容的提问来源于stack exchange,提问作者Encipher
相关产品推荐
相关产品推荐

