web-dev-qa-db-ja.com

文字列内のすべての文字にfor-eachループを適用する方法を教えてください。

だから私は文字列の中の各文字について繰り返したい。

ので、私は考えました:

for (char c : "xyz")

しかし、私はコンパイラエラーが出ます:

MyClass.Java:20: foreach not applicable to expression type

これどうやってするの?

166
Lyndon White

char内のすべてのStringをfor-eachにする最も簡単な方法は、toCharArray()を使用することです。

for (char ch: "xyz".toCharArray()) {
}

これによりfor-each構文の簡潔さが得られますが、残念ながらString(不変)はchar[](これは変更可能)を生成するために防御的なコピーを実行しなければならないため、多少のコストがかかります。

の資料から

[toCharArray()は]新しく割り当てられた文字配列を返します。長さはこの文字列の長さで、内容はこの文字列で表される文字シーケンスを含むように初期化されます。

配列内の文字を反復するもっと冗長な方法(通常のforループ、CharacterIteratorなど)がありますが、コストを払うつもりならば、toCharArray() for eachが最も簡潔です。

300
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
   char c = s.charAt(i);
}

39

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);
}
6
codaddict

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 を参照してください。

4
i_am_zero

別の便利な解決策は、この文字列を文字列の配列として扱うことです。

for (String s : "xyz".split("")) {
    System.out.println(s);
}
4
kyxap

Java 8を使用している場合、Stringchars()を使用して文字のStreamを取得できますが、chars()intを返すので、charIntStreamに戻す必要があります。

"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コレクションのコミッターです。

2
Donald Raab

この場合、ラムダを使うこともできます。

    String s = "xyz";
    IntStream.range(0, s.length()).forEach(i -> {
        char c = s.charAt(i);
    });
1
ander4y748