我有一个 ArrayLists 的 HashMap 如下:
HashMap<String, ArrayList<Double>> Flkn = new HashMap<String, ArrayList<Double>>();
Flkn.put("T_"+l+"_"+k+"_"+n, new ArrayList());
l
、k
和 n
根据多个循环获取它们的值,因此它们的值会根据参数而变化。
在这种情况下,我想知道对于给定的 k 值,如何在相关的 ArrayList 中找到元素的最小值和最大值。 (请注意,长度或 ArrayLists 也取决于参数)
例如,假设我想知道 k=3
的 ArrayList 中的最小值和最大值。那么我正在寻找的是所有具有键的 ArrayLists ("T_"+l+"_"+3+"_"+n)
for every value of l
和 n
。这里的问题是我无法预测 l
和 n
的值,因为它们完全取决于代码。另一个不方便的事情是我想从 l
和 n
获取它们的值的循环中获取最小值和最大值,因此直接使用这些变量是不可行的.
什么是让 Java 调用 l
和 n
的每个值并获取 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"));
这些函数在应用于键时分别返回 k
、l
或 n
(如果知道更优雅的方法,请发表评论或编辑)。
为了尽可能更有效(不是遍历整个 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/