2017-04-08 14 views
0

次のような問題が発生しています。このCollectors.toList()は別々の文字列の代わりに、唯一1つの文字列"E1^E2^E3^E4"を作成するいくつかの理由Java、Collectors.toList()は1つの要素しか作成しません

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]))); 
} 

:このタスクの点は、ストリームを使用することです。 私はこれが私が間違っているところです:Arrays.stream(s.split("_")[1].split("^"))ですが、どこで正確に修正するのかわかりません。もっとので、これはうまく動作し、上記の1と非常によく似ているので:

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(" \\^")'をエスケープします。 ---しかし、 'contains()'がfalseを返すときに入力に存在しないもので 'split()'を呼び出すと、入力全体で1要素の配列が返されます。 'contains()'呼び出しは時間の無駄です。 – Andreas

+1

期待される出力は? – developer

+0

@アンドレアス、ありがとう、それは問題でした!また、 'contains()'呼び出しがなくてもうまく動作するので、そのヒントもありがとう。 –

答えて

2

わからないあなたの予想出力はどうあるべきか、それがこの

[D1、E1、E2、E3、E4、D2、E1、E2]その後、

1のようなものだ場合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()); 
    } 
} 

ここからは、正規表現を考慮し、(必要であれば)より多くの柔軟性を持っている2番目の引数としてparseStringにそれを渡すことができます。

+0

実行する文字列処理を実現するためにStream APIは必要ありません。 – scottb

+0

もちろん、彼の質問に「この仕事のポイントはストリームを使うことです」と述べられているように、彼はストリームアプローチを求めていました。 – artlovan

+0

ストリームがない場合: 'return Arrays.asList(str.split(" [_ ^〜] "));' – 4castle

関連する問題