为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

收到一只叮咚 2019-11-25 15:36:18
我知道如何计算字符串中某个字符或数字的索引,但是我可以使用任何预定义的方法在第n个位置给我该字符吗?因此,在字符串“ foo”中,如果我要求索引为0的字符,它将返回“ f”。注意-在上述问题中,“字符”不是字符数据类型,而是字符串中的字母或数字。这里重要的是,调用该方法时,我不会收到char,而是一个字符串(长度为1)。而且我知道substring()方法,但是我想知道是否有更整洁的方法。
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

您正在寻找的方法是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的文档中提取了我的信息。


查看完整回答
反对 回复 2019-11-25
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

你要 .charAt()


这是一个教程


"mystring".charAt(2)

退货 s


如果您想拥有一个字符串,可以通过以下两种方法将字符转换为字符串:


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

要么


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

甚至


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

例如。


查看完整回答
反对 回复 2019-11-25
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

对于Unicode基本多义平面以外的字符编码的代理对,提出的答案均不适用。


这是一个使用三种不同技术来迭代字符串的“字符”(包括使用Java 8流API)的示例。请注意,此示例包含Unicode补充多语言平面(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之外的字符。另一方面,其他两个解决方案可以很好地处理代理对。


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 1212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信