Java 如何将for-each循环应用于字符串中的每个字符?
所以我想对字符串中的每个字符进行迭代 所以我想:Java 如何将for-each循环应用于字符串中的每个字符?,java,string,loops,foreach,char,Java,String,Loops,Foreach,Char,所以我想对字符串中的每个字符进行迭代 所以我想: for (char c : "xyz") 但我得到一个编译器错误: MyClass.java:20: foreach not applicable to expression type 我如何才能做到这一点?String s=“xyz”; String s = "xyz"; for(int i = 0; i < s.length(); i++) { char c = s.charAt(i); } 对于(int i=0;i
for (char c : "xyz")
但我得到一个编译器错误:
MyClass.java:20: foreach not applicable to expression type
我如何才能做到这一点?String s=“xyz”;
String s = "xyz";
for(int i = 0; i < s.length(); i++)
{
char c = s.charAt(i);
}
对于(int i=0;i
为
字符串中的每个字符创建字符串的最简单方法是使用tocharray()
:
这为您提供了每个构造的简洁性,但不幸的是,String
(它是不可变的)必须执行防御性复制才能生成char[]
(它是可变的),因此会有一些成本损失
从:
[ToCharray()
返回]新分配的字符数组,其长度为该字符串的长度,其内容初始化为包含该字符串表示的字符序列
对数组中的字符进行迭代有更多详细的方法(常规for循环、CharacterIterator
等),但如果您愿意为每种方法支付成本,则最简洁的方法是tocharray()
。您需要使用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);
}
对于遍历字符串,您还可以对字符串使用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中的字符串处理方法,有助于遍历特定字符的字符串 另一个有用的解决方案,您可以将此字符串作为字符串数组使用
for (String s : "xyz".split("")) {
System.out.println(s);
}
如果您使用Java 8,您可以对字符串使用chars()
来获取字符流,但是您需要将int
转换回char
,因为chars()
返回IntStream
"xyz".chars().forEach(i -> System.out.print((char)i));
如果将Java 8与一起使用,则可以使用带有lambda或方法引用的CharAdapter
类forEach
方法来迭代字符串中的所有字符
Strings.asChars("xyz").forEach(c -> System.out.print(c));
此特定示例还可以使用方法引用
Strings.asChars("xyz").forEach(System.out::print)
注意:我是Eclipse集合的提交者。在这种情况下,您也可以使用lambda
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
,如中所述:
返回一个整数为零的流,从该值扩展字符值
序列将传递映射到代理代码点的任何字符
通过毫无疑问的方式。如果序列在流运行时发生突变
读取时,结果未定义
为什么使用forEach
而不使用forEach
?
forEach
的行为显然是不确定的,因为forEachOrdered
在流的遭遇顺序中对该流的每个元素执行操作,如果流具有定义的遭遇顺序。因此,forEach
不能保证订单会被保留。另外,请查看此以了解更多信息
我们还可以使用codePoints()
来打印,有关更多详细信息,请参见此部分。不幸的是,Java没有使字符串
实现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++);
}
};
}
}
公共类CharSequenceCharacterable实现了Iterable{
专用字符序列;
公共CharSequenceCharacterable(CharSequenceCS){
这个.cs=cs;
}
@凌驾
公共迭代器迭代器(){
返回新的迭代器(){
私有整数指数=0;
@凌驾
公共布尔hasNext(){
返回索引
现在,您可以(稍微)轻松地为(char c:new charSequenceCharacterable(“xyz”))运行。
。OP期望的是inhanced for循环。投票被否决,因为这不是OP要求的。虽然这是一个有效的解决方案,但它完全不是被问到的问题。无论OP期望什么,它的性能都比我猜的要好。你知道for(char st:“xyz”.tocharray()){}
是什么吗?-1 off topic(topic:for each),使用charAt而不是charAt编译器识别出不需要真正的副本并应用适当的优化?@Pacerier否,当前的Java编译器将永远不会优化代码。@RAnders00因此,在这种情况下,ToCharray()
被调用3次,字符串长度为211900000
,(char c:str.toCharArray(){}
的完成时间约为250ms,而(char c:charArray){}
的完成时间为@RafiduzzamanSonnet:No,toCharArray()
不在循环体内部;它只被调用一次,然后循环在结果数组上迭代。(for-each循环不同于一般的for
-loop,后者评估每次迭代的停止条件。)这会创建多个对象,因此如果没有一个警告,这个答案是不完整的,即它可能比简单的索引循环效率低。优雅,但不幸的是,如果字符串中的任何元素split()
映射到多个Java字符,这就不起作用了,这几乎适用于所有表情符号。例如,示例的这个变体将循环四次而不是三次:For(字符串s:“x
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++);
}
};
}
}