2017-02-17 8 views
3

私はJava 8ストリームの使い方を学んでいます。私は、forループの代わりに次を使用してストリームを行うことができます方法:他のすべての配列要素を連結する

public static void clump(ArrayList strList) 
{ 
    for(int i = 0; i < strList.size() - 1; i++) 
    { 
     String newStr = "(" + strList.get(i) + " " 
       + strList.get(i + 1) + ")"; 

     strList.set(i, newStr); 
     strList.remove(i + 1); 
    } 
} 

答えて

4

使用0と半分リストのサイズ、および要素を掛け間IntStreamを2によって:

List<String> joined = 
    IntStream.range(0, strList.size()/2) 
     .mapToObj(i -> "(" + strList.get(2*i) + " " 
       + strList.get(2*i + 1) + ")") 
     .collect(Collectors.toList()); 

これは参加します要素を新しいリストに追加します。

List<String> subList = strList.subList(0, strList.size()/2 * 2); 
subList.clear(); 
subList.addAll(joined); 

Ideone Demo


:元のリストからの未加入の要素を取り除く、および参加の要素を付加するために、我々はリストの変更可能なビューであるsubList、使用することができますサブリストのものに代わるものは、あまりにも、ストリームの最後の要素を処理するために、次のようになります。

List<String> joined = 
    IntStream.range(0, (1 + strList.size())/2) 
     .mapToObj(i -> 
      (2*i + 1) < strList.size() 
       ? "(" + strList.get(2*i) + " " + strList.get(2*i + 1) + ")" 
       : strList.get(2*i)) 
     .collect(Collectors.toList()); 

Ideone demo

0

@Andy Turnerが提供する答えは素晴らしく見えます。ここで私は代替ソリューションをAbacusUtilで提供しています。

List<String> strList = N.asList("a", "b", "c", "d"); 
List<String> result = Stream.of(strList).split(2).map(e -> e.join(" ", "(", ")")).toList(); 
N.println(result); // [(a b), (c d)] 

strList = N.asList("a", "b", "c", "d", "e"); 
result = Stream.of(strList).split(2).map(e -> e.join(" ", "(", ")")).toList(); 
N.println(result); // [(a b), (c d), (e)] 
関連する問題