문자열에서 특정 문자 또는 숫자의 색인을 처리하는 방법을 알고 있지만 n 번째 위치 에서 문자를 제공하는 데 사용할 수있는 사전 정의 된 방법이 있습니까? 따라서 문자열 “foo”에서 인덱스 0의 문자를 요청하면 “f”를 반환합니다.
참고-위의 질문에서 “문자”는 char 데이터 유형이 아니라 문자열의 문자 또는 숫자를 의미합니다. 여기서 중요한 것은 메소드가 호출 될 때 char을받지 않고 문자열 (길이 1)이라는 것입니다. 그리고 substring () 메서드에 대해 알고 있지만 더 깔끔한 방법이 있는지 궁금합니다.
답변
찾고있는 방법은 charAt
입니다. 예를 들면 다음과 같습니다.
String text = "foo";
char charAtZero = text.charAt(0);
System.out.println(charAtZero); // Prints f
자세한 정보는의 Java 문서를String.charAt
참조하십시오 . 다른 간단한 튜토리얼을 원한다면, 이 튜토리얼 또는 이 튜토리얼 .
결과를 char
데이터 형식이 아니라 문자열로 사용하려면 다음 Character.toString
방법을 사용하십시오 .
String text = "foo";
String letter = Character.toString(text.charAt(0));
System.out.println(letter); // Prints f
Character
클래스와 toString
메소드 에 대한 자세한 정보를 원하면 Character.toString의 문서에서 정보를 가져 왔습니다 .
답변
당신이 원하는 .charAt()
"mystring".charAt(2)
보고 s
문자열을 사용하는 데 어려움이 있다면 문자를 문자열로 변환하는 몇 가지 방법이 있습니다.
String mychar = Character.toString("mystring".charAt(2));
또는
String mychar = ""+"mystring".charAt(2);
또는
String mychar = String.valueOf("mystring".charAt(2));
예를 들어.
답변
제안 된 답변 중 어느 것도 Unicode Basic Multiligual Plane 외부의 문자를 인코딩하는 데 사용되는 대리 쌍에 대해 작동하지 않습니다 .
다음은 세 가지 기술을 사용하여 문자열의 “문자”를 반복하는 예제입니다 (Java 8 스트림 API 사용 포함). 이 예에는 SMP (Unicode Supplementary Multilingual Plane) 문자가 포함되어 있습니다. 이 예제와 결과를 올바르게 표시하려면 적절한 글꼴이 필요합니다.
// String containing characters of the Unicode
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown ? jumps over the lazy ????";
문자 반복
첫 번째 해결책은 모든 char
문자열에 대한 간단한 루프 입니다.
/* 1 */
System.out.println(
"\n\nUsing char iterator (do not work for surrogate pairs !)");
for (int pos = 0; pos < str.length(); ++pos) {
char c = str.charAt(pos);
System.out.printf("%s ", Character.toString(c));
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
}
코드 포인트 반복
두 번째 솔루션은 명시 적 루프도 사용하지만 codePointAt로 개별 코드 포인트에 액세스 하고 charCount 에 따라 루프 인덱스를 증가시킵니다 .
/* 2 */
System.out.println(
"\n\nUsing Java 1.5 codePointAt(works as expected)");
for (int pos = 0; pos < str.length();) {
int cp = str.codePointAt(pos);
char chars[] = Character.toChars(cp);
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to a `char[]`
// as code points outside the Unicode BMP
// will map to more than one Java `char`
System.out.printf("%s ", new String(chars));
// ^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
pos += Character.charCount(cp);
// ^^^^^^^^^^^^^^^^^^^^^^^
// Increment pos by 1 of more depending
// the number of Java `char` required to
// encode that particular codepoint.
}
Stream API를 사용하여 코드 포인트를 반복
세 번째 솔루션은 기본적으로 두 번째 솔루션과 동일하지만 Java 8 Stream API를 사용합니다 .
/* 3 */
System.out.println(
"\n\nUsing Java 8 stream (works as expected)");
str.codePoints().forEach(
cp -> {
char chars[] = Character.toChars(cp);
// ^^^^^^^^^^^^^^^^^^^^^
// Convert to a `char[]`
// as code points outside the Unicode BMP
// will map to more than one Java `char`
System.out.printf("%s ", new String(chars));
// ^^^^^^^^^^^^^^^^^
// Convert to String as per OP request
});
결과
해당 테스트 프로그램을 실행하면 다음을 얻습니다.
Using char iterator (do not work for surrogate pairs !)
T h e q u i c k b r o w n ? ? j u m p s o v e r t h e l a z y ? ? ? ? ? ? ? ?
Using Java 1.5 codePointAt(works as expected)
T h e q u i c k b r o w n ? j u m p s o v e r t h e l a z y ? ? ? ?
Using Java 8 stream (works as expected)
T h e q u i c k b r o w n ? j u m p s o v e r t h e l a z y ? ? ? ?
보시다시피 (상형 문자를 올바르게 표시 할 수있는 경우) 첫 번째 솔루션은 유니 코드 BMP 외부의 문자를 올바르게 처리하지 못합니다. 반면에 다른 두 솔루션은 서로 게이트 쌍을 잘 처리합니다.
답변
substring()
요구 사항이 주어지면 꽤 붙어 있습니다. 표준 방법은 charAt()
이지만 char 데이터 형식을 허용하지 않는다고 말했습니다.
답변
String.charAt(int index)
메소드 결과를 String.valueOf (char c) 의 매개 변수로 사용할 수 있습니다 .
String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position.
답변
charAt
문자를 얻지 못하는 요구 사항과 결합 된 하이브리드 접근 방식은 다음 과 같습니다.
newstring = String.valueOf("foo".charAt(0));
그러나 그것은 substring()
정직한 것보다 실제로 “더 이상”은 아닙니다 .
답변
다음과 같이 간단합니다.
String charIs = string.charAt(index) + "";