だから私は文字列の中の各文字について繰り返したい。
ので、私は考えました:
for (char c : "xyz")
しかし、私はコンパイラエラーが出ます:
MyClass.Java:20: foreach not applicable to expression type
これどうやってするの?
char
内のすべてのString
をfor-eachにする最も簡単な方法は、toCharArray()
を使用することです。
for (char ch: "xyz".toCharArray()) {
}
これによりfor-each構文の簡潔さが得られますが、残念ながらString
(不変)はchar[]
(これは変更可能)を生成するために防御的なコピーを実行しなければならないため、多少のコストがかかります。
の資料から :
[
toCharArray()
は]新しく割り当てられた文字配列を返します。長さはこの文字列の長さで、内容はこの文字列で表される文字シーケンスを含むように初期化されます。
配列内の文字を反復するもっと冗長な方法(通常のforループ、CharacterIterator
など)がありますが、コストを払うつもりならば、toCharArray()
for eachが最も簡潔です。
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Stringクラスの toCharArray
()メソッドを使用して、Stringオブジェクトをcharの配列に変換する必要があります。
String str = "xyz";
char arr[] = str.toCharArray(); // convert the String object to array of char
// iterate over the array using the for-each loop.
for(char c: arr){
System.out.println(c);
}
Java 8では、次のように解くことができます。
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
メソッドchars()は、 doc で説明されているようにIntStream
を返します。
このシーケンスのchar値をゼロ拡張したintのストリームを返します。サロゲートコードポイントにマップされるすべてのcharは、未解釈のまま渡されます。ストリームの読み取り中にシーケンスが変更された場合、結果は未定義です。
forEachOrdered
ではなくforEach
を使用するのはなぜですか?forEach
の動作は明示的に非決定的です。ここで、forEachOrdered
はこのストリームの各要素に対してアクションを実行します。ストリームにの出現順定義済みの出会い順そのためforEach
は順序が守られることを保証しません。こちらもチェックしてください 質問 詳細については。
codePoints()
を使って印刷することもできます。詳しくは answer を参照してください。
別の便利な解決策は、この文字列を文字列の配列として扱うことです。
for (String s : "xyz".split("")) {
System.out.println(s);
}
Java 8を使用している場合、String
にchars()
を使用して文字のStream
を取得できますが、chars()
がint
を返すので、char
をIntStream
に戻す必要があります。
"xyz".chars().forEach(i -> System.out.print((char)i));
Eclipse Collections を指定してJava 8を使用する場合は、CharAdapter
クラスのforEach
メソッドをラムダまたはメソッド参照と共に使用して、String
内のすべての文字を反復処理できます。
CharAdapter.adapt("xyz").forEach(c -> System.out.print(c));
この特定の例ではメソッド参照も使用できます。
CharAdapter.adapt("xyz").forEach(System.out::print)
注:私はEclipseコレクションのコミッターです。
この場合、ラムダを使うこともできます。
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});