Lyn*_*ite 176 java string foreach loops char
所以我想迭代字符串中的每个字符.
所以我认为:
for (char c : "xyz")
Run Code Online (Sandbox Code Playgroud)
但是我收到编译错误:
MyClass.java:20: foreach not applicable to expression type
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
pol*_*nts 315
为,每每最简单的方法char
在一个String
是使用toCharArray()
:
for (char ch: "xyz".toCharArray()) {
}
Run Code Online (Sandbox Code Playgroud)
这为您提供了for-each构造的简洁性,但不幸的是String
(这是不可变的)必须执行防御性副本来生成char[]
(这是可变的),因此存在一些成本损失.
从文档:
[
toCharArray()
returns] 一个新分配的字符数组,其长度为该字符串的长度,其内容初始化为包含该字符串表示的字符序列.
有更多冗长的方法来迭代数组中的字符(常规循环CharacterIterator
等),但如果你愿意支付成本toCharArray()
- 每个都是最简洁的.
Mat*_*hen 48
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
Run Code Online (Sandbox Code Playgroud)
如果您使用 Java 8,则可以使用chars()
on aString
来获取 aStream
字符,但您需要将其转换int
回 achar
作为chars()
返回 an IntStream
。
"xyz".chars().forEach(i -> System.out.print((char)i));
Run Code Online (Sandbox Code Playgroud)
如果您将 Java 8 与Eclipse Collections 一起使用,您可以使用带有 lambda 或方法引用的CharAdapter
类forEach
方法来迭代String
.
Strings.asChars("xyz").forEach(c -> System.out.print(c));
Run Code Online (Sandbox Code Playgroud)
这个特定的例子也可以使用方法引用。
Strings.asChars("xyz").forEach(System.out::print)
Run Code Online (Sandbox Code Playgroud)
注意:我是 Eclipse Collections 的提交者。
另一个有用的解决方案,您可以使用此字符串作为String数组
for (String s : "xyz".split("")) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
您需要使用toCharArray
String类的()方法将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);
}
Run Code Online (Sandbox Code Playgroud)
在Java 8 中,我们可以将其解决为:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
Run Code Online (Sandbox Code Playgroud)
方法 chars() 返回doc 中IntStream
提到的一个:
返回一个 int 流,零扩展此序列中的 char 值。映射到代理代码点的任何字符都未经解释地传递。如果在读取流时序列发生变异,则结果未定义。
forEachOrdered
而不是forEach
?的行为forEach
是明确地不确定性,其中作为forEachOrdered
执行用于该流的每个元件的操作,在该流的遭遇顺序如果流具有规定的遭遇顺序。所以forEach
不保证订单会被保留。另请查看此问题以获取更多信息。
我们也可以codePoints()
用于打印,有关更多详细信息,请参阅此答案。
小智 5
不幸的是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++);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以(在某种程度上)轻松地运行for (char c : new CharSequenceCharacterIterable("xyz"))
......