簡體   English   中英

如何將 for-each 循環應用於字符串中的每個字符?

[英]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 ,但您需要將intchar因為chars()返回一個IntStream

"xyz".chars().forEach(i -> System.out.print((char)i));

如果您將 Java 8 與Eclipse Collections 一起使用,您可以使用帶有 lambda 或方法引用的CharAdapterforEach方法來迭代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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM