用于拆分字符串并存储在HashMap Java 8中的模式

时间:2019-01-10 05:53:57

标签: java arraylist collections java-8 java-stream

我想分割以下字符串并将其存储在HashMap中:

String currentString= "firstName-lastName-rollNum-departmentNum=firstName1-lastName1-rollNum1-departmentNum1"; 

我希望将输出存储在地图中,例如连字符(-)(firstName)之前的第一个字符串和(=)(firstName1)之后的第一个字符串,.........即

{firstName=firstName1,lastName=lastName1,rollNum=rollNum1,departmentNum=departmentNum1}

以下代码不适用于我的模式:

Map<String,String> mapVal= null;
mapVal = Pattern.compile("\\s*=\\s*")
                .splitAsStream(currentString.trim())
                .map(s -> s.split("-", 2))
                .collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: ""));

一旦我分割了字符串,我就不明白如何将所需的值汇总在一起,如上所示。如果您没有收到我的问题,我深表歉意。

谢谢!

5 个答案:

答案 0 :(得分:7)

一种更简单的方法是只对标准数组使用split。

String[] keyValues = currentString.split("=", 2);
String[] keys = keyValues[0].split("-");
String[] values = keyValues[1].split("-", keys.length);
Map<String, String> map = IntStream.range(0, keys.length).boxed()
        .collect(Collectors.toMap(i -> keys[i], i -> values[i]));

这里没有错误检查,但希望它将为您提供总体思路。

答案 1 :(得分:3)

this answer所示,此处基于普通数组的操作可能会简单得多。

但是,如果您坚持使用Stream解决方案,它可能看起来像

Map<String,String> mapVal= Stream.of(currentString)
    .map(s0 -> Arrays.stream(s0.split("\\s*=\\s*", 2))
        .map(s1 -> s1.split("-")).toArray(String[][]::new))
    .flatMap(a -> IntStream.range(0, a[0].length)
        .mapToObj(i -> new String[]{ a[0][i], i < a[1].length? a[1][i]: "" }))
    .collect(Collectors.toMap(a -> a[0], a -> a[1]));

答案 2 :(得分:2)

另一种解决方案:

App

这里,我们首先根据String[] arr = Arrays.toString(currentString.split("=")) .replaceAll("[\\[\\]]", "").replaceAll(",", "-") .split("-"); Map<String, String> collect = IntStream.range(0, arr.length / 2).boxed() .collect(Collectors.toMap(i -> arr[i], i -> arr[i + arr.length / 2])); 拆分字符串,然后使用=从字符串中删除所有出现的.toString()]。现在我们将[替换为,,以便我们可以基于-

拆分结果字符串

在第一条语句之后,数组-如下所示:

  

[名字,姓氏,rollNum,部门编号,名字1,姓氏1,   rollNum1,departmentNum1]

现在我们要做的就是遍历结果数组(arr)到中点(arr)并使用Collectors.toMap对其进行映射

答案 3 :(得分:0)

其他方式如下:

Pattern pattern = Pattern.compile("\\s*=\\s*");
int index = currentString.indexOf("=");
Map<Boolean, List<String>> map = pattern
            .splitAsStream(currentString.trim())
            .flatMap(s -> Stream.of(s.split("-")))
            .collect(partitioningBy(s -> currentString.indexOf(s) > index));

此步骤的结果是:

{
  false=[firstName, lastName, rollNum, departmentNum],

  true=[firstName1, lastName1, rollNum1, departmentNum1]
}

,然后将先前的结果转换为最终结果:

IntStream.range(0, map.get(true).size())
            .boxed()
            .collect(toMap(i -> map.get(false).get(i), i -> map.get(true).get(i)));

答案 4 :(得分:0)

public static Map<String, String> toMap(String str) {
    String[] arr = str.split("[-=]");
    Map<String, String> map = new LinkedHashMap<>();

    for (int i = 0, j = arr.length / 2; j < arr.length; i++, j++)
        map.put(arr[i], arr[j]);

    return map;
}