รับอักขระสตริงตามดัชนี - Java


230

ฉันรู้วิธีการจัดทำดัชนีของตัวละครหรือตัวเลขในสตริง แต่มีวิธีใดที่กำหนดไว้ล่วงหน้าที่ฉันสามารถใช้เพื่อให้อักขระที่ตำแหน่งที่n ได้หรือไม่ ดังนั้นในสตริง "foo" ถ้าฉันถามหาตัวอักษรที่มีดัชนี 0 มันจะคืนค่า "f"

หมายเหตุ - ในคำถามข้างต้นโดย "ตัวละคร" ฉันไม่ได้หมายถึงประเภทข้อมูลถ่าน แต่ตัวอักษรหรือตัวเลขในสตริง สิ่งสำคัญที่นี่คือฉันไม่ได้รับถ่านเมื่อวิธีการที่ถูกเรียก แต่สตริง (ความยาว 1) และฉันรู้เกี่ยวกับวิธีย่อย () วิธีการ แต่ฉันสงสัยว่ามีวิธีแบบ neater หรือไม่


13
มันคือ? คำตอบนั้นค่อนข้างตรงไปตรงมา
ametren

คุณสังเกตเห็นว่าเขาไม่ต้องการcharคุณค่าหรือไม่? และเขาก็รู้วิธีที่จะทำsubstring()แต่ต้องการแค่ "ผู้ดูแล" เท่านั้น FYI ฉันสามารถพูดได้ว่าsubstring()เป็นวิธีที่เรียบร้อยที่สุด
user845279

3
@ user845279 Character.toStringปฏิบัติตามข้อกำหนดที่จำเป็นทั้งหมดและไม่ยุ่งเลย
Ricardo Altamirano

@pythonscript ฉันเห็นด้วย แต่มันก็ไม่ได้แตกต่างจากการใช้substring()โดยตรง
user845279

1
ฉันมางานปาร์ตี้สายนี้ แต่ @RicardoAltamirano ค่อนข้างเข้าใจผิด endIndex(พารามิเตอร์ที่สอง) ของString.substring(int, int)เป็นพิเศษดัชนีและมันจะไม่โยนข้อยกเว้นสำหรับindex + 1ตราบเท่าที่index < length()- ที่เป็นจริงแม้สำหรับตัวอักษรตัวสุดท้ายในสตริง
William Price

คำตอบ:


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 นั้นดีกว่า doc เกี่ยวกับตัวละคร
Chaojun Zhong

ฉันเห็นด้วยกับ @ChaojunZhong นี่ เป็นคำตอบที่เหมาะสมกว่าเนื่องจากไม่แนะนำให้ใช้ charAt () เพราะคุณจะมีปัญหาเมื่อคุณมีตัวอักษรที่ต้องการรหัส 2 หน่วย
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 พื้นฐาน Multiligual เครื่องบิน

นี่คือตัวอย่างการใช้เทคนิคที่แตกต่างกันสามวิธีในการวนซ้ำ "อักขระ" ของสตริง (รวมถึงการใช้ Java 8 stream API) โปรดสังเกตว่าตัวอย่างนี้ประกอบด้วยอักขระของ Unicode Supplementary Multilingual Plane (SMP) คุณต้องมีแบบอักษรที่เหมาะสมเพื่อแสดงตัวอย่างนี้และผลลัพธ์อย่างถูกต้อง

// 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   𓊃 𓍿 𓅓 𓃡 

อย่างที่คุณเห็น (ถ้าคุณสามารถแสดงกราฟฟิคได้อย่างถูกต้อง) โซลูชันแรกไม่สามารถจัดการอักขระที่เหมาะสมนอก Unicode BMP ได้อย่างถูกต้อง ในอีกทางหนึ่งอีกสองวิธีแก้ปัญหาได้ดีกับคู่ตัวแทน


8

คุณค่อนข้างติดอยู่กับsubstring()ความต้องการของคุณ วิธีมาตรฐานจะเป็นcharAt()แต่คุณบอกว่าคุณจะไม่ยอมรับประเภทข้อมูลถ่าน


ยุติธรรมพอสมควร แต่เนื่องจาก char เป็นชนิดดั้งเดิมฉันคิดว่าtoString()จะไม่ทำงานและvalueOf()เป็นเพียงตัวเลข (ฉันคิดว่าฉันอาจผิด) ดังนั้นฉันจะแปลงอักขระเป็นสตริงได้อย่างไร
Bluefire

"ในคำถามข้างต้นโดย" ตัวละคร "ฉันไม่ได้หมายถึงประเภทข้อมูลถ่าน" - ฉันไม่ได้อ่านสิ่งนี้เป็น "ฉันจะไม่ยอมรับ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);

OP ระบุว่าStringมีความยาว 1 เป็นที่ต้องการไม่ char
William Price

6 คำตอบอื่น ๆ รวมถึงคำตอบที่ได้รับการแนะนำcharAt()เป็นวิธีแก้ปัญหา คำตอบนี้เพิ่มอะไร?
Dan Getz

6
นอกจากนี้ดูเหมือนว่าคุณกำลังบอกใบ้ซึ่งcharAt()ใช้ดัชนีที่อิง 1 โดยมีอักขระที่แตกต่างกันเพียงตัวเดียวaในตำแหน่งที่สาม ถ้านั่นเป็นเรื่องจริงมันก็เป็นการดีที่คุณจะพูดหรืออธิบายมากกว่าจะบอกใบ้ ในความเป็นจริงที่ว่าไม่จริง: charAt()ใช้ 0 ตามดัชนีเพื่อจะs 'h'
Dan Getz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.