我想拆分下面的字符串并将其存储在HashMap中:
String currentString= "firstName-lastName-rollNum-departmentNum=firstName1-lastName1-rollNum1-departmentNum1";
我希望我的输出存储在map中,就像连字符(-)(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]: ""));
一旦我拆分了字符串,我不明白如何将所需的值放在一起,如上所示。如果您不明白我的问题,我深表歉意。
提前感谢!!
一种更简单的方法是只对标准数组使用 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]));
这没有错误检查,但希望它能给你一个大致的想法。
如本答案所示,基于纯数组的操作在这里可能要简单得多。
但是,如果您坚持使用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]));
另一种解决方案:
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()
从字符串中删除所有出现的]
和[
。现在我们将,
替换为-
,以便我们可以根据-
拆分生成的字符串
在第一条语句之后,数组arr
如下所示:
[名字, 姓氏, 卷号, 部门编号, 名字1, 姓氏1, rollNum1, DepartmentNum1]
现在我们需要做的就是遍历生成的数组(arr
)到中点(arr.length / 2
),并使用Collectors.toMap映射它
其他方式是这样的:
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)));
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;
}