2016-11-16 4 views
3

以下のコードでは、出力を最初の3文字に限定するのはなぜですか?ストリームの文字列の制限が文字配列に基づいて動作しない

String vowelOne = "aaebcd"; 

Stream 
    .of(vowelOne.toCharArray()) 
    .limit(3)  
    .forEach(System.out::println); 

出力:

aaebcd 

私は出力になりたい:プリミティブ配列を生成することになるため

aae 
+0

もhttp://stackoverflow.com/questions/39874242/stream-vs-stream-of/39874305とhttp://stackoverflow.com/questions/32471799/convert-a-string-to-を参照してください。 a-java-util-streamcharacterおよびhttp://stackoverflow.com/questions/27888429/how-can-i-create-a-stream-from-an-array – Tunaki

答えて

3

Stream.of(char[])はちょうどArrays.asList()のような(単一char[]要素のStreamを生成しますList)、limit(3)は、を切り捨てません(printlnを使用しても、すべての文字が1行に印刷されていることからもわかる)char[]を印刷しています。

試してみてください。

vowelOne.chars() // this returns an IntStream of the characters of the input String 
     .limit(3) 
     .forEach(i->System.out.println((char)i)); // without the casting to char, you'll 
                // get the numeric value of the first 3 
                // characters 

が出力:

a 
a 
e 
+1

コードポイント()の代わりにchars )。 – Eugene

0

エランが述べたように、Stream.of(char[])は、あなたがそれをする必要はありませStream<char>として、Stream<char[]>が生成されます。これを回避する追加の方法があります。あなたは箱入りタイプの配列Character[]

static Character[] toCharacterArray(String s) { 
    Character[] array = new Character[s.length()]; 
    for(int i = 0; i < s.length(); i++) { 
     array[i] = s.charAt(i); 
    } 
    return array; 
} 

を必要とし、この

Stream 
    .of(toCharacterArray(vowelOne)) 
    .limit(3) 
    .forEach(System.out::println); 

それとも、どちらの方法が

になり String[]

String vowelOne = "aaebcd"; 

Stream 
    .of(vowelOne.split("")) 
    .limit(3) 
    .forEach(System.out::println); 

を作成するためにString.split("")を使用することができますようにそれを使用しますか

a 
a 
e 
+0

あなたは各文字の配列を作成し、それをString []に保存した後、配列の数をに制限しました。 それはうまくいくでしょうが、単純に文字列を入力するのではなく、複雑で複雑であると思いません。 –

+0

@AhmadAlsanie各文字を 'String []'にどこに保存しますか? – QBrute

+0

vowelOne.split( "") - >はストリング[a]、ストリング[a]、ストリング[e]、ストリング[b]、ストリング[c]、ストリング[d]を作成します –

1

一般に、chars()ではなくcodePoints()が優れており、サロゲートペアも処理します。私はこの質問にあなたの場合にはあまりにも多いかもしれないことを認めなければならない。

private static String firstN(String input, int limit) { 
    StringBuilder builder = new StringBuilder(); 
    input.codePoints().limit(limit).forEach(builder::appendCodePoint); 
    return builder.toString(); 
} 
+1

これは、 'limit'が何を指しているのかという疑問につながります。偶数コードポイントは概念文字ではありません。つまり、複数のコードポイントで構成されているキャラクターの中央で右に分割することができます。ところで、 '.mapToObj(i - > i)'は廃止され、次のステップでunboxing権を行うだけのボクシング操作を行います。 @Holger確かに、 – Holger

+1

。私はすぐに複数のコードポイントを持つdevanagariの手紙について考えました。フランス語やスウェーデン語の手紙のような単純なケースでは、正規化を最初に適用する必要があります。私は正直であるとは考えられません。はい、そのマップは悪いコピー/貼り付け、thxでした。 – Eugene

+0

[ここ](http://stackoverflow.com/a/20268845/2711488)に示されているように、 'collect'を使って、それをより洗練された'すべての '無能なソリューションにすることができます。 – Holger

関連する問題