有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据第一列的值将表转换为列表<Map<String,String>>

编辑:我现在只限于Java8

我有一个表,它总是有3列:id | key | value

我可以很容易地将这个表设置为List<List<String>>格式(每一行都是字符串列表)或List<String>格式(列表中的所有表值)。 但我的实际目标是List<Map<String,String>>(或Map<String, Map<String, String>>参见示例),其中映射包含表的键值对,每个列表包含表的相同给定id的所有键值对

例如下表

| ID    | KEY   | VALUE     |
|----   |-----  |-------    |
| 1     | A     | X         |
| 1     | B     | Y         |
| 2     | C     | Z         |
| 3     | D     | BLA       |

应该变成

{
    ((A=X),(B=Y)),
    ((C=Z)),
    ((D=BLA)),
}

ID列仅用于分组

ID可以是从数字到字母数字的任何内容

我想出了一些有效的方法,但它很丑陋,也许有一种方法可以做得更好,更可读,也许可以使用流

    List<List<String>> myTable = something;
    Map<String, Map<String, String>> outerMap = new HashMap<>();
    Map<String, String> innerMap = new HashMap<>();
    for (List<String> s: myTable ) {
        if (!outerMap.containsKey(s.get(0))) {
            innerMap.clear();
        }   
        innerMap.put(s.get(1), s.get(2));
        outerMap.put(s.get(0), new HashMap<>(innerMap));
    }

请注意,我创建HashMap时经常使用outerMap的方式


共 (3) 个答案

  1. # 1 楼答案

    通过像这样使用流API::forEach

    来自JDK-9+

            myTable.forEach(row -> {
                outerMap.put(row.get(0), new HashMap<>(Map.of(row.get(1), row.get(2))));
            });
    
  2. # 2 楼答案

    这不像使用流那样优雅,但可能更容易理解:

    public static void main(String[] args) {
        List<List<String>> myTable = Arrays.asList(Arrays.asList("1", "A", "X"), Arrays.asList("1", "B", "Y"),
                Arrays.asList("2", "C", "Z"), Arrays.asList("3", "D", "BLA"));
    
        Map<String, Map<String, String>> result = new HashMap<>();
    
        for (List<String> row : myTable) {
            String id = row.get(0);
    
            Map<String, String> map = result.get(id);
            if (map == null) {
                Map<String, String> entry = new HashMap<>();
                entry.put(row.get(1), row.get(2));
                result.put(id, entry);
            } else
                map.put(row.get(1), row.get(2));
        }
    }
    
  3. # 3 楼答案

    您可以使用流API来实现这一点

    首先groupingByID用于外部映射,然后toMapby KEY VALUE用于内部映射

    Map<String, Map<String, String>> res = myTable.stream()
                  .collect(Collectors.groupingBy(e -> e.get(0),  
                          Collectors.toMap(f -> f.get(1),g -> g.get(2))));
    

    并获取外部映射的唯一值

    List<Map<String, String>> list = new ArrayList<>(res.values());