首页 > 解决方案 > 从数据库表中填充 Java HashMap

问题描述

我有一个有两列的表,一列是字符串,另一列是双列。例如,

+========+=============+
| Center | Efficiency  |
+========+=============+
| A1     | 0.603576904 |
+--------+-------------+
| A2     | 0.557877389 |
+--------+-------------+
| A3     |  0.70911818 |
+--------+-------------+
| A4     | 0.048944132 |
+--------+-------------+
| A1     | 0.064781491 |
+--------+-------------+
| A2     | 0.192317935 |
+--------+-------------+
| A3     | 0.316078683 |
+--------+-------------+
| A4     | 0.121362541 |
+--------+-------------+
| A1     | 0.815996499 |
+--------+-------------+
| A2     | 0.032305255 |
+--------+-------------+
| A3     | 0.750355015 |
+--------+-------------+
| A4     | 0.071286058 |
+--------+-------------+

我正在尝试读取所有值并将它们加载到Java HashMap<String, Double[]>

我在读取表数据方面没有任何问题,但无法按照我的意愿将它们放入 HashMap 中。

我编写了一个示例代码来从两个不同的字符串数组和双精度数组填充一个 HashMap,但仍然对使用数组的 Hashmap 的值部分感到困惑。

  String[] names = { "8A", "8C", "8J", "8A", "8C", "8J", "8A", "8C", "8J", "8A", "8C", "8J", };

  Double[] metrics = { 0.60, 0.55, 0.70, 0.04, 0.06, 0.19, 0.31, 0.12, 0.81, 0.03, 0.75, 0.07 };

  for (int i = 0; i < 12; i++)
  {
     if (values.get(names[i]) == null)
     {
        values.put(names[i], new ArrayList<Double>(Arrays.asList(metrics[i])));
     }
     else
        values.get(names[i]).add(metrics[i]);
  }

  System.out.println(values);

任何建议我如何处理作为数组的 HashMap 的值部分,其大小将取决于表行号。

标签: javasqlhashmap

解决方案


现在 Map 有一些方便的方法,你可以使用 computeIfAbsent:

Map<String, List<Double>> values = new HashMap<>();
        for (int i = 0; i < 12; i++) {
            List<Double> items = values.computeIfAbsent(names[i], k -> new ArrayList<>());
            items.add(metrics[i]);
        }

这里有一个更详细的帖子。

但是如果你想要一个Map<String, double[]>then 在加载过程中非常不方便,因为数组有固定的大小,你需要一遍又一遍地复制它们。您可以double[]使用列表版本进行加载并最终转换它

Map<String, double[]> dvalues = new HashMap<>();
values.forEach((k, v) -> dvalues.put(k, v.stream().mapToDouble(i -> i).toArray()));

或者如果它应该是Double[]

Map<String, Double[]> dvalues = new HashMap<>();
values.forEach((k, v) -> dvalues.put(k, v.toArray(new Double[v.size()])));

我看到的唯一选择是对原始数据进行两次迭代,首先计算每个键的值的数量,使用适当大小的数组创建一个映射,再次迭代原始数据,跟踪每个值数组中的 maxIdx 为他们填满了......非常复杂。


推荐阅读