我想对字符串中的每个字符进行迭代。

所以我想:

for (char c : "xyz")

但我得到一个编译器错误:

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

我该怎么做呢?


当前回答

for-each String中的每个字符最简单的方法是使用toCharArray():

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

这为您提供了for-each结构的简便性,但不幸的是,String(不可变)必须执行防御性复制来生成char[](不可变),因此有一些代价。

从文档中可以看到:

[toCharArray()返回]一个新分配的字符数组,其长度为该字符串的长度,其内容被初始化为包含该字符串表示的字符序列。

在数组中迭代字符有更冗长的方法(常规for循环,CharacterIterator等),但如果你愿意付出代价,toCharArray() for-each是最简洁的。

其他回答

你需要使用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);
}

另一个有用的解决方案,您可以将此字符串作为string数组使用

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

对于字符串,您也可以使用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中字符串处理的方法,它帮助遍历特定字符的字符串。

不幸的是,Java没有使String实现Iterable<字符>。这很容易做到。有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"))…

for-each String中的每个字符最简单的方法是使用toCharArray():

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

这为您提供了for-each结构的简便性,但不幸的是,String(不可变)必须执行防御性复制来生成char[](不可变),因此有一些代价。

从文档中可以看到:

[toCharArray()返回]一个新分配的字符数组,其长度为该字符串的长度,其内容被初始化为包含该字符串表示的字符序列。

在数组中迭代字符有更冗长的方法(常规for循环,CharacterIterator等),但如果你愿意付出代价,toCharArray() for-each是最简洁的。