2017-04-08 46 views
0

我有麻烦让下面的工作。这个任务的关键是使用流: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]); 

谢谢!

+3

'split()'参数是一个正则表达式,'^'是匹配字符串开头的特殊匹配模式。要在'^'上分割,转义它,即split(“\\ ^”)'。 ---然而,使用输入中不存在的东西来调用split(),即当contains()返回false时,将返回一个包含整个输入的单元数组。 'contains()'调用是浪费时间。 – Andreas

+1

您的预期产出是多少? – developer

+0

@Andreas,谢谢你,那就是问题所在!另外,它没有'contains()'调用就可以正常工作,所以谢谢你的提示。 –

回答

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作为第二个参数有更大的灵活性(如果需要)。

+0

Stream API不需要实现您执行的字符串处理。 – scottb

+0

当然不是,但正如他的问题“这个任务的重点是使用流”中所述,他要求流式处理。 – artlovan

+0

没有流:'返回Arrays.asList(str.split(“[_ ^〜]”));' – 4castle

相关问题