Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将for-each循环应用于字符串中的每个字符?_Java_String_Loops_Foreach_Char - Fatal编程技术网

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++);
            }
        };
    }
}