将具有列表值的地图转换为 Java 中的列表

Converting a Map with List values into a List in Java

我有一个 Map<Double, List<String>> 包含以下元素:

{1.0=[AP], 2.2=[AB], 2.5=[AC], 3.5=[AD], 4.5=[AE, AF], 6.30000000000001=[AG]}

我希望将这些元素添加到列表中,以便它可以像这样打印出来或像这样打印出来:

[AP 1.0, AB 2.2, AC 2.5, AD 3.5 , AE 4.5, AF 4.5, AG 6.3] 

我该怎么做?

我试过以下方法

Map<Double, List<String>> mapToPopulate = new TreeMap<Double, List<String>>();
List <String> output = new ArrayList<>();

// after populating map
 for(Double d: mapToPopulate .keySet()) {
     result.add(mapToPopulate.get(d) + " " + d);}

但它以这种形式打印出来

[[AP] 1.0,[AB] 2.2,[AC] 2.5,[AD] 3.5, [AE, AF] 4.5,[AG] 6.30000000000001]

我注意到,您在这里直接获取列表并将值附加到它,并将其存储在列表中。

填充地图后,您可以使用以下代码生成您期望的结果。

// After populating map
List<String> result = mapToPopulate.entrySet()
            .stream()
            .flatMap(en -> en.getValue().stream().map(v -> v + " " + en.getKey()))
            .collect(Collectors.toList());

由于您希望将映射到特定键的列表中的每个字符串作为单独的项目添加到结果列表中,并与其键连接,因此您需要遍历每个值列表(在您的您连接列表的字符串表示的代码 ).

您可以通过添加 嵌套循环.

来实现

并且最好在外循环中建立迭代入口集。因为每个 entry 都持有对 value 的直接引用并允许几乎立即访问它(在 O(1) 时间)。同时,使用方法 get() 访问映射到特定 keyvalue 将需要额外的操作,即使您使用的是 HashMap,对于 TreeMap 方法,get() 的速度要慢得多,执行时间为 O(n)。因此,此更改可以显着提高性能。

代码可能如下所示:

public static void main(String[] args) {
    Map<Double, List<String>> source =
        Map.of(1.0, List.of("AP"), 2.2, List.of("AB"), 2.5, List.of("AC"),
            3.5, List.of("AD"), 4.5, List.of("AE", "AF"), 6.30000000000001, List.of("AG"));
    
    NavigableMap<Double, List<String>> mapToPopulate = new TreeMap<>(source);
    List<String> result = new ArrayList<>();
    
    for (Map.Entry<Double, List<String>> entry : mapToPopulate.entrySet()) {
        for (String value : entry.getValue())
            result.add(entry.getKey() + " " + value);
    }

    System.out.println(result);
}

输出

[1.0 AP, 2.2 AB, 2.5 AC, 3.5 AD, 4.5 AE, 4.5 AF, 6.30000000000001 AG]

旁注:

  • 当使用 TreeMap 时,如果您不希望引用它的变量被分配给未排序的 Map 接口实现,最好使用 NavigableMap 接口作为类型。它会让您访问 firstEntry()firstKey()higherKey()headMap() 等方法,这些方法在 Map 界面中不可用。