如何将for-each循环应用于String中的每个字符?

时间:2010-03-16 01:53:56

标签: java string loops foreach char

所以我想迭代字符串中的每个字符。

所以我想:

for (char c : "xyz")

但是我收到编译错误:

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

我该怎么做?

9 个答案:

答案 0 :(得分:299)

char中每个String的最简单方法是使用toCharArray()

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

这为您提供了for-each构造的简洁性,但不幸的是String(不可变)必须执行防御性副本以生成char[](这是可变的),因此需要一些成本罚。

来自documentation

  

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

有更多冗长的方法来迭代数组中的字符(常规for循环,CharacterIterator等)但是如果你愿意支付费用toCharArray() - 每个都是最简洁的

答案 1 :(得分:39)

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

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:4)

Java 8 中,我们可以解决它:

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

方法chars()返回doc中提到的IntStream

  

返回一个int流,从中对此值进行零扩展   序列。传递映射到代理代码点的任何char   通过解释。如果序列在流时发生变异   正在阅读,结果未定义。

为什么要使用forEachOrdered而不是forEach

forEach的行为明确是不确定的,因为forEachOrdered对此流的每个元素执行操作,如果流具有遇到流的顺序定义的遭遇订单。所以forEach并不保证订单会被保留。另请查看question以获取更多信息。

我们也可以使用codePoints()进行打印,有关详细信息,请参阅此answer

答案 5 :(得分:3)

不幸的是,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")) ...

答案 6 :(得分:2)

如果您使用Java 8,则可以chars()使用String获取Stream个字符,但您需要将int强制转换为char chars()返回IntStream

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

如果将Java 8与Eclipse Collections一起使用,则可以使用CharAdapterforEach方法和lambda或方法引用来迭代{{1}中的所有字符}。

String

此特定示例也可以使用方法参考。

CharAdapter.adapt("xyz").forEach(c -> System.out.print(c));

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:-7)

对于Traverse a String,您还可以将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中字符串处理的方法,它有助于遍历特定字符的字符串。