Nhận chuỗi ký tự theo chỉ mục - Java


230

Tôi biết cách tính chỉ số của một ký tự hoặc số nhất định trong một chuỗi, nhưng có phương pháp nào được xác định trước mà tôi có thể sử dụng để đưa cho tôi ký tự ở vị trí thứ n không? Vì vậy, trong chuỗi "foo", nếu tôi hỏi ký tự có chỉ số 0 thì nó sẽ trả về "f".

Lưu ý - trong câu hỏi trên, theo "ký tự" Tôi không có nghĩa là kiểu dữ liệu char, mà là một chữ cái hoặc số trong một chuỗi. Điều quan trọng ở đây là tôi không nhận được char khi phương thức được gọi, mà là một chuỗi (có độ dài 1). Và tôi biết về phương thức chuỗi con (), nhưng tôi đã tự hỏi liệu có cách nào gọn gàng hơn không.


13
Nó là? Câu trả lời là khá đơn giản.
ametren

Bạn có nhận thấy anh ta không muốn một chargiá trị? Và anh ấy biết làm thế nào substring()nhưng chỉ muốn một cách "gọn gàng" hơn. FYI, tôi có thể nói đó substring()là cách gọn gàng nhất.
dùng845279

3
@ user845279 Character.toStringđáp ứng tất cả các yêu cầu cần thiết và hoàn toàn không lộn xộn.
Ricardo Altamirano

@pythonscript Tôi đồng ý, nhưng nó không khác nhiều so với sử dụng substring()trực tiếp.
dùng845279

1
Tôi đến bữa tiệc muộn, nhưng @RicardoAltamirano thì hơi nhầm. Các endIndex(tham số thứ hai) của String.substring(int, int)là một độc quyền chỉ mục, và nó sẽ không ném một ngoại lệ cho index + 1chừng nào index < length()- đó là sự thật ngay cả đối với các nhân vật cuối cùng trong chuỗi.
William Giá

Câu trả lời:


339

Phương pháp bạn đang tìm kiếm là charAt. Đây là một ví dụ:

String text = "foo";
char charAtZero = text.charAt(0);
System.out.println(charAtZero); // Prints f

Để biết thêm thông tin, xem tài liệu Java trênString.charAt . Nếu bạn muốn một hướng dẫn đơn giản khác, cái này hoặc cái này .

Nếu bạn không muốn kết quả là một charkiểu dữ liệu, mà là một chuỗi, bạn sẽ sử dụng Character.toStringphương thức:

String text = "foo";
String letter = Character.toString(text.charAt(0));
System.out.println(letter); // Prints f

Nếu bạn muốn biết thêm thông tin về Characterlớp học và toStringphương thức, tôi đã lấy thông tin của mình từ tài liệu trên Character.toString .


1
"Điều quan trọng ở đây là tôi không nhận được char khi phương thức được gọi, nhưng là một chuỗi", nhưng dù sao cũng cảm ơn (upvote): D
Bluefire

1
Tôi nghĩ câu trả lời của Sylvain Leroux là tốt hơn. doc về nhân vật
Chaojun Zhong

Tôi đồng ý với @ChaojunZhong đây là một câu trả lời phù hợp hơn vì không nên sử dụng charAt () vì bạn sẽ gặp vấn đề khi bạn có các ký tự cần 2 đơn vị mã.
bastazalan

43

Bạn muốn .charAt()

Đây là một hướng dẫn

"mystring".charAt(2)

trả lại s

Nếu bạn không thích có một chuỗi, có một số cách để chuyển đổi char thành chuỗi:

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

Hoặc là

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

Hoặc thậm chí

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

Ví dụ.


@ametren Việc nối chuỗi có thích hợp hơn Character.toStringkhông?
Ricardo Altamirano

Tôi nghĩ rằng điều đó có thể đi xuống một vấn đề sở thích cá nhân. Bạn cũng có thể làmString mychar = String.valueOf("mystring".charAt(2));
ametren

Để tiếp tục, sở thích cá nhân của tôi trong trường hợp này sẽ là String mychar = ""+"mystring".charAt(2);vì nó ngắn gọn nhất. Những người khác sẽ khác nhau trong quan điểm của họ về điều này.
ametren

10

Không có câu trả lời được đề xuất nào hoạt động cho các cặp thay thế được sử dụng để mã hóa các ký tự bên ngoài Mặt phẳng đa biến Unicode Basic .

Dưới đây là một ví dụ sử dụng ba kỹ thuật khác nhau để lặp lại các "ký tự" của chuỗi (bao gồm sử dụng API luồng Java 8). Xin lưu ý ví dụ này bao gồm các ký tự của Mặt phẳng đa ngôn ngữ bổ sung Unicode (SMP). Bạn cần một phông chữ thích hợp để hiển thị ví dụ này và kết quả chính xác.

// String containing characters of the Unicode 
// Supplementary Multilingual Plane (SMP)
// In that particular case, hieroglyphs.
String str = "The quick brown 𓃥 jumps over the lazy 𓊃𓍿𓅓𓃡";

Lặp đi lặp lại của ký tự

Giải pháp đầu tiên là một vòng lặp đơn giản trên tất cả charcác chuỗi:

/* 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
}

Lặp lại các điểm mã

Giải pháp thứ hai cũng sử dụng một vòng lặp rõ ràng, nhưng truy cập các điểm mã riêng lẻ bằng codePointAt và tăng chỉ số vòng lặp tương ứng với 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.
}

Lặp lại các điểm mã bằng API Stream

Giải pháp thứ ba về cơ bản giống như giải pháp thứ hai, nhưng sử dụng API luồng Java 8 :

/* 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
    });

Các kết quả

Khi bạn chạy chương trình thử nghiệm đó, bạn có được:

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

Như bạn có thể thấy (nếu bạn có thể hiển thị chữ tượng hình đúng cách), giải pháp đầu tiên không xử lý đúng các ký tự bên ngoài Unicode BMP. Mặt khác, hai giải pháp còn lại xử lý tốt các cặp thay thế.


8

Bạn khá bế tắc substring(), đưa ra yêu cầu của bạn. Cách tiêu chuẩn sẽ là charAt(), nhưng bạn nói bạn sẽ không chấp nhận kiểu dữ liệu char.


Đủ công bằng. Nhưng, vì char là kiểu nguyên thủy, tôi cho rằng toString()sẽ không hoạt động với nó và valueOf()chỉ dành cho số (tôi nghĩ, tôi có thể sai), vậy làm cách nào để chuyển đổi char thành chuỗi?
Bluefire

"trong câu hỏi trên, bởi" ký tự "Tôi không có nghĩa là kiểu dữ liệu char" - Tôi không đọc nó là "Tôi sẽ không chấp nhận char"
ametren

@Bluefire Xem câu trả lời của tôi. Character.toStringnên hoạt động (đó là một phương thức tĩnh từ Characterlớp.
Ricardo Altamirano


5

Một cách tiếp cận kết hợp charAtvới yêu cầu không nhận char của bạn có thể là

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

Nhưng điều đó không thực sự "gọn gàng" hơn substring()là thành thật.



4

Đây là mã chính xác. Nếu bạn đang sử dụng zybooks, điều này sẽ trả lời tất cả các vấn đề.

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

0

nếu ai đó đang vật lộn với kotlin, mã là:

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

điều này sẽ trả về char ở vị trí 1, trong trường hợp này k nhớ, chỉ số bắt đầu ở vị trí 0, vì vậy trong mẫu này: kotlin sẽ là k = vị trí 0, o = vị trí 1, t = vị trí 2, l = vị trí 3, i = vị trí 4 và n = vị trí 5


-3

Như thế này:

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

OP tuyên bố rằng a Stringcó độ dài 1 là mong muốn, không phải a char.
William Giá

6 câu trả lời khác, bao gồm câu trả lời được chấp nhận, được đề xuất charAt()như một giải pháp khả thi. Câu trả lời này thêm gì?
Dan Getz

6
Ngoài ra, có vẻ như bạn đang gợi ý charAt()sử dụng các chỉ số dựa trên 1, bằng cách chỉ có ký tự khác ở avị trí thứ ba. Nếu đó là sự thật, thì tốt hơn là bạn nên nói hoặc giải thích điều đó hơn là gợi ý về nó. Trong thực tế điều đó không đúng: charAt()sử dụng các chỉ số dựa trên 0, vì vậy ssẽ được 'h'.
Dan Getz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.