通过索引获取字符串字符 - Java

Blu*_*ire 217 java string

我知道如何计算字符串中某个字符或数字的索引,但有没有任何预定义的方法可以用来给我第n个位置的字符?所以在字符串"foo"中,如果我要求索引为0的字符,则返回"f".

注 - 在上面的问题中,"字符"我不是指char数据类型,而是字符串中的字母或数字.这里重要的是我在调用方法时没有收到char,而是一个字符串(长度为1).我知道substring()方法,但我想知道是否有更简洁的方法.

Ric*_*ano 329

你正在寻找的方法是charAt.这是一个例子:

String text = "foo";
char charAtZero = text.charAt(0);
System.out.println(charAtZero); // Prints f
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Java文档String.charAt.如果你想要另一个简单的教程,这个那个.

如果您不希望结果作为char数据类型,而是希望作为字符串,则可以使用以下Character.toString方法:

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

如果你想了解关于Character类和toString方法的更多信息,我从Character.toString的文档中提取了我的信息.


ame*_*ren 40

你要 .charAt()

这是一个教程

"mystring".charAt(2)
Run Code Online (Sandbox Code Playgroud)

回报 s

如果您对使用字符串感到满意,可以使用以下几种方法将char转换为字符串:

String mychar = Character.toString("mystring".charAt(2));
Run Code Online (Sandbox Code Playgroud)

要么

String mychar = ""+"mystring".charAt(2);
Run Code Online (Sandbox Code Playgroud)

甚至

String mychar = String.valueOf("mystring".charAt(2));
Run Code Online (Sandbox Code Playgroud)

例如.


Syl*_*oux 10

所提出的答案都不适用于用于编码Unicode Basic Multiligual Plane之外的字符的代理对.

下面是一个使用三种不同技术迭代字符串"字符"的示例(包括使用Java 8流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 ";
Run Code Online (Sandbox Code Playgroud)

迭代字符

第一个解决方案是对所有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
}
Run Code Online (Sandbox Code Playgroud)

迭代代码点

第二个解决方案也使用显式循环,但是使用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.
}
Run Code Online (Sandbox Code Playgroud)

使用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
    });
Run Code Online (Sandbox Code Playgroud)

结果

运行该测试程序时,您将获得:

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       
Run Code Online (Sandbox Code Playgroud)

如您所见(如果您能够正确显示象形文字),第一个解决方案无法正确处理Unicode BMP之外的字符.另一方面,另外两个解决方案与代理对配合得很好.


Tho*_*mas 8

substring()鉴于您的要求,您非常坚持.标准方式是charAt(),但是你说你不接受char数据类型.


Fra*_*eth 6

您可以使用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.
Run Code Online (Sandbox Code Playgroud)


fvu*_*fvu 5

结合charAt您不获取字符的要求的混合方法可能是

newstring = String.valueOf("foo".charAt(0));
Run Code Online (Sandbox Code Playgroud)

但这并不比substring()说实话更“整洁” 。


Aqi*_*mid 5

它很简单:

String charIs = string.charAt(index) + "";
Run Code Online (Sandbox Code Playgroud)