【问题标题】:Java 8 Split String and Create Map inside MapJava 8拆分字符串并在地图内创建地图
【发布时间】:2019-03-21 20:34:22
【问题描述】:

我有一个像101-1-5,101-2-4,102-1-5,102-2-5,102-3-5,103-1-4 这样的字符串。

我想将此添加到Map<String, Map<String, String>>

点赞:{101={1=5, 2=4}, 102={1=5, 2=5, 3=5}, 103={1=4}}

如何使用 Java 8 流来做到这一点?

我尝试使用普通的 Java。而且效果很好。

public class Util {
    public static void main(String[] args) {

        String samp = "101-1-5,101-2-4,102-1-5,102-2-5,102-3-5,103-1-4";

        Map<String, Map<String, String>> m1 = new HashMap<>();
        Map<String, String> m2 = null;

        String[] items = samp.split(",");

        for(int i=0; i<items.length; i++) {
            String[] subitem = items[i].split("-");
            if(!m1.containsKey(subitem[0]) || m2==null) {
                m2 = new HashMap<>();
            }
            m2.put(subitem[1], subitem[2]);
            m1.put(subitem[0], m2);
        }
        System.out.println(m1);
    }
}

【问题讨论】:

    标签: java split java-8 java-stream


    【解决方案1】:

    您可以为此使用以下 sn-p:

    Map<String, Map<String, String>> result = Arrays.stream(samp.split(","))
            .map(i -> i.split("-"))
            .collect(Collectors.groupingBy(a -> a[0], Collectors.toMap(a -> a[1], a -> a[2])));
    

    首先,它创建一个项目流,这些项目映射到包含子项目的数组流。最后,您通过在第一个子项上使用 group by 来收集所有内容,并创建一个内部映射,其中第二个值作为键,最后一个作为值。

    结果是:

    {101={1=5, 2=4}, 102={1=5, 2=5, 3=5}, 103={1=4}}
    

    【讨论】:

      【解决方案2】:
      Map<String, Map<String, String>> map = Arrays.stream(samp.split(","))
              .map(s -> s.split("-"))
              .collect(Collectors.toMap(
                      o -> o[0],
                      o -> Map.of(o[1], o[2]),
                      (m1, m2) -> Stream.concat(m1.entrySet().stream(), m2.entrySet().stream())
                              .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))));
      

      Map.of 来自 Java 9,如果您使用的是 Java 8,则可以使用 AbstractMap.SimpleEntry

      Samuel 的 answer 更好,更简洁。

      【讨论】:

        猜你喜欢
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 2014-04-01
        • 2022-01-16
        • 2022-11-30
        • 1970-01-01
        相关资源
        最近更新 更多