[英]How do I apply the for-each loop to every character in a String?
所以我想對字符串中的每個字符進行迭代。
所以我認為:
for (char c : "xyz")
但我收到一個編譯器錯誤:
MyClass.java:20: foreach not applicable to expression type
我怎樣才能做到這一點?
對String
每個char
進行 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);
}
另一個有用的解決方案,您可以將此字符串用作字符串數組
for (String s : "xyz".split("")) {
System.out.println(s);
}
您需要使用 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
上使用chars()
來獲取字符Stream
,但您需要將int
回char
因為chars()
返回一個IntStream
。
"xyz".chars().forEach(i -> System.out.print((char)i));
如果您將 Java 8 與Eclipse Collections 一起使用,您可以使用帶有 lambda 或方法引用的CharAdapter
類forEach
方法來迭代String
所有字符。
Strings.asChars("xyz").forEach(c -> System.out.print(c));
這個特定的例子也可以使用方法引用。
Strings.asChars("xyz").forEach(System.out::print)
注意:我是 Eclipse Collections 的提交者。
在Java 8 中,我們可以將其解決為:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
方法 chars() 返回doc 中提到的IntStream
:
返回一個 int 流,零擴展此序列中的 char 值。 映射到代理代碼點的任何字符都未經解釋地傳遞。 如果在讀取流時序列發生變異,則結果未定義。
forEachOrdered
而不是forEach
? 的行為forEach
是明確地不確定性,其中作為forEachOrdered
執行用於該流的每個元件的操作,在該流的遭遇順序如果流具有規定的遭遇順序。 所以forEach
不保證訂單會被保留。 另請查看此問題以獲取更多信息。
我們還可以使用codePoints()
進行打印,有關更多詳細信息,請參閱此答案。
不幸的是,Java 沒有讓String
實現Iterable<Character>
。 這很容易做到。 有StringCharacterIterator
但它甚至沒有實現Iterator
......所以制作你自己的:
public class CharSequenceCharacterIterable implements Iterable<Character> {
private CharSequence cs;
public CharSequenceCharacterIterable(CharSequence cs) {
this.cs = cs;
}
@Override
public Iterator<Character> iterator() {
return new Iterator<Character>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < cs.length();
}
@Override
public Character next() {
return cs.charAt(index++);
}
};
}
}
現在你可以(有點)輕松地運行for (char c : new CharSequenceCharacterIterable("xyz"))
...
在這種情況下,您也可以使用 lambda。
String s = "xyz";
IntStream.range(0, s.length()).forEach(i -> {
char c = s.charAt(i);
});
對於 Travers an String,您還可以將charAt()
與字符串一起使用。
喜歡 :
String str = "xyz"; // given String
char st = str.charAt(0); // for example we take 0 index element
System.out.println(st); // print the char at 0 index
charAt()
是 java 中的字符串處理方法,它有助於遍歷特定字符的字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.