[java] for-each 루프를 문자열의 모든 문자에 어떻게 적용합니까?
그래서 문자열의 각 문자를 반복하고 싶습니다.
그래서 나는 생각했다.
for (char c : "xyz")
하지만 컴파일러 오류가 발생합니다.
MyClass.java:20: foreach not applicable to expression type
어떻게해야합니까?
답변
대한-각 각에 가장 쉬운 방법 char
A의가 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);
}
답변
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);
}
답변
Java 8 에서는 다음과 같이 해결할 수 있습니다.
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
chars () 메소드 IntStream
는 doc 에서 언급 한대로를 반환합니다 .
이 순서로부터 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 char
로 chars()
반환해야합니다 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의 커미터입니다.