색인으로 문자열 문자 가져 오기-Java


230

문자열에서 특정 문자 또는 숫자의 색인을 처리하는 방법을 알고 있지만 n 번째 위치 에서 문자를 제공하는 데 사용할 수있는 사전 정의 된 방법이 있습니까? 따라서 문자열 "foo"에서 인덱스 0의 문자를 요청하면 "f"를 반환합니다.

참고-위의 질문에서 "문자"는 char 데이터 유형이 아니라 문자열의 문자 또는 숫자를 의미합니다. 여기서 중요한 것은 메소드가 호출 될 때 char을받지 않고 문자열 (길이 1)이라는 것입니다. 그리고 substring () 메서드에 대해 알고 있지만 더 깔끔한 방법이 있는지 궁금합니다.


13
그것은? 대답은 매우 간단합니다.
ametren

그가 char가치를 원하지 않는다는 것을 알았습니까 ? 그리고 그는 어떻게해야할지 substring()알지만 "더 나은"방법을 원합니다. 참고로, 그것이 substring()가장 끔찍한 방법 이라고 말할 수 있습니다 .
user845279

3
@ user845279 Character.toString는 필요한 모든 요구 사항을 충족하며 전혀 지저분하지 않습니다.
Ricardo Altamirano

@ pythonscript 동의하지만 substring()직접 사용하는 것과 크게 다르지 않습니다 .
user845279

1
나는이 파티에 늦었지만 @RicardoAltamirano는 약간의 실수입니다. endIndex의 (두 번째 매개 변수) String.substring(int, int)이다 전용 인덱스, 그것은 하지 않습니다 에 대한 예외를 던질 index + 1만큼 index < length()- 심지어 문자열의 마지막 문자에 대한 사실이다.
윌리엄 가격

답변:


339

찾고있는 방법은 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의 문서에서 정보를 가져 왔습니다 .


1
(upvote에) 어쨌든,하지만 덕분에 "여기서 중요한 것은 내가 방법은 호출되는 문자,하지만 문자열을받을 수 없다는 것입니다": D
Bluefire

1
Sylvain Leroux의 답변이 더 낫습니다. Character
Chaojun Zhong

나는 @ChaojunZhong에 동의 당신이이 개 코드 단위를 필요로 문자를 할 때 문제가 될 것이다 원인 () 수 charAt을 사용하지 않는 것이 좋습니다 때문에 더 적당한 대답이다.
bpunzalan

43

당신이 원하는 .charAt()

튜토리얼은 다음과 같습니다

"mystring".charAt(2)

보고 s

문자열을 사용하는 데 어려움이 있다면 문자를 문자열로 변환하는 몇 가지 방법이 있습니다.

String mychar = Character.toString("mystring".charAt(2));

또는

String mychar = ""+"mystring".charAt(2);

또는

String mychar = String.valueOf("mystring".charAt(2));

예를 들어.


@ametren 문자열 문자열 연결이 선호 Character.toString됩니까?
Ricardo Altamirano

나는 그것이 개인적 취향의 문제로 귀결 될 수 있다고 생각합니다. 당신은 또한 할 수 있습니다String mychar = String.valueOf("mystring".charAt(2));
ametren

요약하자면,이 경우의 개인적 취향 String mychar = ""+"mystring".charAt(2);은 가장 간결하기 때문입니다. 다른 사람들은 이것에 대한 의견이 다를 것입니다.
ametren

10

제안 된 답변 중 어느 것도 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 외부의 문자를 올바르게 처리하지 못합니다. 반면에 다른 두 솔루션은 서로 게이트 쌍을 잘 처리합니다.


8

substring()요구 사항이 주어지면 꽤 붙어 있습니다. 표준 방법은 charAt()이지만 char 데이터 형식을 허용하지 않는다고 말했습니다.


그럴 수 있지. 그러나 char은 기본 유형이므로 toString()작동하지 않는다고 가정 valueOf()하고 숫자에만 해당합니다 (제 생각에 틀릴 수도 있습니다) .char를 문자열로 변환하는 방법은 무엇입니까?
Bluefire

"위의 질문에서"문자 "는 char 데이터 형식을 의미하지 않습니다."나는 이것을 받아들이지 않을 것입니다. char"
ametren

@Bluefire 내 답변을 참조하십시오. Character.toString작동합니다 (이것은 Character클래스 의 정적 메소드입니다 .
Ricardo Altamirano


5

charAt문자를 얻지 못하는 요구 사항과 결합 된 하이브리드 접근 방식은 다음 과 같습니다.

newstring = String.valueOf("foo".charAt(0));

그러나 그것은 substring()정직한 것보다 실제로 "더 이상"은 아닙니다 .



4

올바른 코드는 다음과 같습니다. zybooks를 사용하는 경우 모든 문제에 대한 답이됩니다.

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}

0

누군가 kotlin으로 어려움을 겪고 있다면 코드는 다음과 같습니다.

var oldStr: String = "kotlin"
var firstChar: String = oldStr.elementAt(0).toString()
Log.d("firstChar", firstChar.toString())

이것은 위치 1의 문자를 반환합니다.이 경우 k는 인덱스 0의 위치에서 시작하므로 kotlin은 k = 위치 0, o = 위치 1, t = 위치 2, l = 위치 3, i = 위치 4 및 n = 위치 5


-3

이처럼 :

String a ="hh1hhhhhhhh";
char s = a.charAt(3);

영업 이익은 밝혔다 String길이가 1 인이 요구되는 하지char.
윌리엄 가격

수락 된 답변을 포함하여 6 개의 다른 답변 charAt()이 가능한 해결책으로 제안 되었습니다. 이 답변은 무엇을 추가합니까?
Dan Getz

6
또한 세 번째 위치에서 charAt()다른 문자 를 사용하여 1 기반 인덱스 를 사용 하는 힌트를 얻는 것처럼 보입니다 a. 그것이 사실이라면, 힌트를주는 것보다 말하거나 설명하는 것이 좋습니다. 의 현실에 없는 사실 : charAt()그래서, 0 기반 인덱스를 사용하는 s것입니다 'h'.
Dan Getz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.