[java] for-each 루프를 문자열의 모든 문자에 어떻게 적용합니까?

그래서 문자열의 각 문자를 반복하고 싶습니다.

그래서 나는 생각했다.

for (char c : "xyz")

하지만 컴파일러 오류가 발생합니다.

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

어떻게해야합니까?



답변

대한-각 각에 가장 쉬운 방법 charA의가 String사용하는 것입니다 toCharArray():

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

이것은 for-each 구성의 간결성을 제공하지만 불행히도 String(불변)는 char[](변경 가능) 을 생성하기 위해 방어 사본을 수행해야 하므로 비용이 약간 듭니다.

로부터 문서 :

[ toCharArray()복귀] 새로 할당 된 문자 배열 이 문자열의 길이와 내용이 문자열로 표시하는 문자 시퀀스를 포함하도록 초기화된다.

배열에서 문자를 반복하는 더 자세한 방법이 CharacterIterator있지만 (정규 for 루프 등), toCharArray()각 비용 을 기꺼이 지불하려는 경우 가장 간결합니다.


답변

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

 


답변

또 다른 유용한 솔루션은이 문자열을 문자열 배열로 사용할 수 있습니다.

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


답변

toCharArrayString 클래스 의 () 메서드를 사용하여 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);
}


답변

Java 8 에서는 다음과 같이 해결할 수 있습니다.

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

chars () 메소드 IntStreamdoc 에서 언급 한대로를 반환합니다 .

이 순서로부터 char 값을 제로 확장하는 int의 스트림을 돌려줍니다. 대리 코드 포인트에 매핑되는 모든 문자는 해석되지 않은 상태로 전달됩니다. 스트림을 읽는 동안 시퀀스가 ​​변경되면 결과가 정의되지 않습니다.

왜 사용 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"))


답변

Java 8을 사용하는 경우 chars()a String를 사용 하여 Stream문자 를 얻을 수 있지만 as int를 a charchars()반환해야합니다 IntStream.

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

Eclipse Collections 와 함께 Java 8을 사용하는 경우 CharAdapter클래스 forEach메소드를 람다 또는 메소드 참조와 함께 사용하여의 모든 문자를 반복 할 수 있습니다 String.

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

이 특정 예제는 메소드 참조를 사용할 수도 있습니다.

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

참고 : 저는 Eclipse Collections의 커미터입니다.