我遇到麻烦让以下工作。这项任务的重点是使用流:
Map<String, List<String>> descriptions = new HashMap<>();
wordArray[2] = "D1_E1^E2^E3^E4~D2_E1^E2";
if(wordArray[2].contains("~")) {
Arrays.stream(wordArray[2].split("~"))
.forEach(s -> descriptions.put(s.split("_")[0],
s.split("_")[1].contains("^")
? Arrays.stream(s.split("_")[1].split("^"))
.collect(Collectors.toList())
: Arrays.asList(s.split("_")[1])));
}
由于某种原因,此Collectors.toList()仅创建一个字符串"E1^E2^E3^E4"
而不是单独的字符串。
我的猜测是,这是我错的地方:Arrays.stream(s.split("_")[1].split("^"))
,但我不知道究竟在哪里以及如何解决它。更是如此,因为它的工作正常,与上面的相似:
List<String> synonyms = new ArrayList<>();
wordArray[3] = "S1_S2_S3_S4";
synonyms = wordArray[3].contains("_")
? Arrays.stream(wordArray[3].split("_")).
collect(Collectors.toList())
: Arrays.asList(wordArray[3]);
谢谢!
答案 0 :(得分:2)
不确定您的预期输出应该是什么,但是如果它是这样的
[D1,E1,E2,E3,E4,D2,E1,E2]
然后,您可以使用Java流执行此操作的方法之一是:
import java.util.List;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
public class Parser {
public static void main(String[] args) {
String str = "D1_E1^E2^E3^E4~D2_E1^E2";
List<String> strings = Parser.parseString(str);
System.out.println(strings);
}
public static List<String> parseString(String str) {
return Stream.of(str)
.map(s -> s.replaceAll("[_^~]", "-").split("-"))
.flatMap(Stream::of)
.collect(toList());
}
}
从这里你可以分解正则表达式并将其作为第二个参数传递给parseString,以获得更大的灵活性(如果需要)。