我有麻烦让下面的工作。这个任务的关键是使用流:Java,Collectors.toList()只创建一个元素
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]);
谢谢!
'split()'参数是一个正则表达式,'^'是匹配字符串开头的特殊匹配模式。要在'^'上分割,转义它,即split(“\\ ^”)'。 ---然而,使用输入中不存在的东西来调用split(),即当contains()返回false时,将返回一个包含整个输入的单元数组。 'contains()'调用是浪费时间。 – Andreas
您的预期产出是多少? – developer
@Andreas,谢谢你,那就是问题所在!另外,它没有'contains()'调用就可以正常工作,所以谢谢你的提示。 –