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

标签 java arraylist hashmap max minimum

我有一个 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/

相关文章:

java hashMap<Integer,String> 碰撞

java - 使用声明的编码 = utf-8 从 xml 中删除非 UTF-8 字符 - Java

java - 关于HashMap的一些疑惑

java - 当我尝试创建 Opengl ES 环境时,我的应用程序不断崩溃

java - java中使用Arraylist的动态二维数组

java - 比较 ArrayList 中的字符?

java - ArrayList 通过调用的方法进行操作

java - HashMap 仅显示最后一个条目

java - 在java文件中查找详细信息

java - 比较两个复杂的字符串数组列表