You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:00:26