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

如何从已排序的LinkedHashMap中获取对应最优值(最小数值)的所有键数组?

解决方案:获取HashMap中对应最优值的所有键

我来帮你搞定这个需求!要实现从排序后的LinkedHashMap中提取所有对应最小Double值的int[]键并转为int[][],可以分两步走:先确定最小的"最优值",再收集所有匹配的键。下面给你两种可行的实现方案,还会帮你注意细节问题~

方案1:利用Stream API(通用且简洁)

这种方法不依赖排序后的顺序,即使后续排序逻辑改变也能正常工作,代码可读性强:

HashMap<int[], Double> hashMap = new HashMap<int[], Double>();
// 初始化你的hashMap数据
hashMap.put(new int[]{1,2,3,4}, 5.0);
hashMap.put(new int[]{1,3,3,4}, 2.0);
hashMap.put(new int[]{1,2,5,4}, -1.0);
hashMap.put(new int[]{1,2,4,4}, -1.0);

LinkedHashMap<int[], Double> sortedMap = sortHashMap(hashMap);
int[][] bestKey;

// 步骤1:找到最小的最优值
Double minValue = sortedMap.values().stream()
    .min(Double::compare)
    .orElse(null); // 处理map为空的情况

// 步骤2:收集所有对应最小值的键
if (minValue != null) {
    List<int[]> bestKeysList = sortedMap.entrySet().stream()
        .filter(entry -> entry.getValue().equals(minValue))
        .map(Map.Entry::getKey)
        .collect(Collectors.toList());
    
    // 步骤3:转成int[][]数组
    bestKey = bestKeysList.toArray(new int[bestKeysList.size()][]);
} else {
    // 空map时返回空数组
    bestKey = new int[0][];
}

方案2:利用排序后的顺序(更高效)

因为你的sortHashMap方法已经按value升序排序了,所以第一个元素的value就是最小值,后面的元素value只会更大。我们可以遍历到第一个不匹配的元素就停止,节省遍历时间:

HashMap<int[], Double> hashMap = new HashMap<int[], Double>();
// 初始化数据
hashMap.put(new int[]{1,2,3,4}, 5.0);
hashMap.put(new int[]{1,3,3,4}, 2.0);
hashMap.put(new int[]{1,2,5,4}, -1.0);
hashMap.put(new int[]{1,2,4,4}, -1.0);

LinkedHashMap<int[], Double> sortedMap = sortHashMap(hashMap);
int[][] bestKey;

if (sortedMap.isEmpty()) {
    bestKey = new int[0][];
} else {
    // 从排序后的map中取第一个元素的value作为最小值
    Double minValue = sortedMap.values().iterator().next();
    List<int[]> bestKeysList = new ArrayList<>();
    
    for (Map.Entry<int[], Double> entry : sortedMap.entrySet()) {
        if (entry.getValue().equals(minValue)) {
            bestKeysList.add(entry.getKey());
        } else {
            break; // 升序排序后,后面的value都更大,无需继续遍历
        }
    }
    
    bestKey = bestKeysList.toArray(new int[0][]);
}

重要注意事项

你用int[]作为HashMap的键,这里要提醒一下:Java中数组的equals()和hashCode()是基于对象引用的,而不是数组内容。也就是说,即使两个数组内容完全相同,只要是不同的对象,HashMap会把它们当成不同的键。如果后续需要添加新的数组键,建议改用List<Integer>或者自定义一个包装类并重写equals()和hashCode(),避免出现不符合预期的键匹配问题。

内容的提问来源于stack exchange,提问作者Kazim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:27:33