如何从已排序的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
相关产品推荐
相关产品推荐

