我如何应用for-each循环到字符串中的每个字符?

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

所以我想:

for (char c : "xyz")

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

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

我该怎么做呢?

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

,

String中for-each每个char最简单的方法是使用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);
}

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

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

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

如果你使用Java 8,你可以在String上使用chars()来获得字符的Stream,但是你需要将int转换回char,因为chars()返回IntStream

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

如果你使用带有Eclipse集合的Java 8,你可以使用带有lambda或方法引用的CharAdapterforEach方法来遍历String中的所有字符。

Strings.asChars("xyz").forEach(c -> System.out.print(c));

这个特殊的例子也可以使用方法引用。

Strings.asChars("xyz").forEach(System.out::print)

注意:我是Eclipse Collections的提交者。

在这种情况下你也可以用。

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

Java 8中,我们可以将其求解为:

String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));

方法chars()返回IntStream,如医生中所述:

返回一个int 0类型的流,从this扩展char值 序列。将传递映射到代理代码点的任何字符 通过粗略的。如果序列发生突变,而流发生突变

.读取时,结果为undefined

为什么使用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"))