색인으로 문자열 문자 가져 오기-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.