gpt4 book ai didi

java - 使用半已知键在 ArrayLists 的 HashMap 中查找最大值和最小值 - Java

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:28 27 4
gpt4 key购买 nike

我有一个 ArrayLists 的 HashMap 如下:

HashMap<String, ArrayList<Double>> Flkn = new HashMap<String, ArrayList<Double>>();
Flkn.put("T_"+l+"_"+k+"_"+n, new ArrayList());

lkn 根据多个循环获取它们的值,因此它们的值会根据参数而变化。

在这种情况下,我想知道对于给定的 k 值,如何在相关的 ArrayList 中找到元素的最小值和最大值。 (请注意,长度或 ArrayLists 也取决于参数)

例如,假设我想知道 k=3 的 ArrayList 中的最小值和最大值。那么我正在寻找的是所有具有键的 ArrayLists ("T_"+l+"_"+3+"_"+n) for every value of ln。这里的问题是我无法预测 ln 的值,因为它们完全取决于代码。另一个不方便的事情是我想从 ln 获取它们的值的循环中获取最小值和最大值,因此直接使用这些变量是不可行的.

什么是让 Java 调用 ln 的每个值并获取 ArrayList 中的值以找到的最小值和最大值的有效方法这些值?

最佳答案

如果您绝对必须处理此类“智能键”,对于基于其部分的任何类型的处理,您首先需要函数来提取这些部分的值:

final static Function<String, Integer> EXTRACT_K = s -> Integer.parseInt(s.replaceAll("T_\\d+_(\\d+)_\\d+", "$1"));
final static Function<String, Integer> EXTRACT_L = s -> Integer.parseInt(s.replaceAll("T_(\\d+)_\\d+_\\d+", "$1"));
final static Function<String, Integer> EXTRACT_N = s -> Integer.parseInt(s.replaceAll("T_\\d+_(\\d+)_\\d+", "$1"));

这些函数在应用于键时分别返回 kln(如果知道更优雅的方法,请发表评论或编辑)。

为了尽可能更有效(不是遍历整个 map ,而是只遍历它的一部分),建议从 HashMap 切换到任何带排序的 SortedMap 实现基于存储在智能 key 中的值:

final static Comparator<String> CMP 
= Comparator.comparing(EXTRACT_K)
.thenComparing(EXTRACT_L)
.thenComparing(EXTRACT_N);

SortedMap<String, List<Double>> map = new TreeMap<>(CMP);

这样你会得到一个 map ,其中条目将首先按 k 排序,然后按 l 排序,最后按 n 排序。现在可以使用以下方法将所有列表映射到给定的 k:

int k = 1;
Collection<List<Double>> lists
= map.subMap(String.format("T_0_%s_0", k), String.format("T_0_%s_0", k + 1)).values();

要获取 subMap 项周围的最大值和最小值,获取其值流,将其转换为 DoubleStream并使用它的 .summaryStatistics()如下:

DoubleSummaryStatistics s  
= subMap.values().stream()
.flatMapToDouble(vs -> vs.stream().mapToDouble(Double::doubleValue))
.summaryStatistics();

最后一部分是检查值是否存在:

if (s.getCount() > 0) {
max = s.getMax();
min = s.getMin();
} else
// no values exist for a given k, thus max and min are undefined

关于java - 使用半已知键在 ArrayLists 的 HashMap 中查找最大值和最小值 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181368/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com