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


230

我知道如何计算字符串中某个字符或数字的索引,但是我可以使用任何预定义的方法在第n个位置给我该字符吗?因此,在字符串“ foo”中,如果我要求索引为0的字符,它将返回“ f”。

注意-在上述问题中,“字符”不是字符数据类型,而是字符串中的字母或数字。这里重要的是,调用该方法时,我不会收到char,而是一个字符串(长度为1)。而且我知道substring()方法,但是我想知道是否有更整洁的方法。


13
它是?答案很简单。
ametren 2012年

您是否注意到他不想要任何char值?他知道该怎么做,substring()但只想采用一种“更整洁”的方式。仅供参考,我可以说这substring()是最干净的方法。
user845279 2012年

3
@ user845279 Character.toString满足所有必要的要求,一点也不乱。
里卡多·阿尔塔米拉诺

@pythonscript我同意,但是与substring()直接使用没有太大区别。
user845279 2012年

1
我参加这个聚会很晚,但是@RicardoAltamirano有点误会。的endIndex(第二个参数)String.substring(int, int)是一个排他索引,它不会抛出异常,index + 1只要index < length()-甚至对于字符串中的最后一个字符也是如此。
威廉·普赖斯

Answers:


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
“这里重要的是,调用该方法时,我不会收到字符,而是一个字符串”,但是无论如何
都要

1
我认为Sylvain Leroux的答案更好。关于角色的文档
仲超俊

我同意@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吗?
里卡多·阿尔塔米拉诺

我认为这可能取决于个人喜好。您也可以这样做String mychar = String.valueOf("mystring".charAt(2));
ametren

顺带一提,在这种情况下,我个人的偏好是String mychar = ""+"mystring".charAt(2);因为它是最简洁的。其他人对此有不同的看法。
ametren

10

对于Unicode Basic Multiligual Plane以外的字符编码的代理对,提出的答案均不适用

这是一个使用三种不同技术来迭代字符串的“字符”的示例(包括使用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之外的字符。另一方面,其他两个解决方案可以很好地处理代理对。


8

substring()鉴于您的要求,您非常满意。标准方法是charAt(),但是您说过您将不接受char数据类型。


很公平。但是,由于char是原始类型,因此我认为toString()将无法使用它,并且valueOf()仅适用于数字(我认为可能是错误的),那么如何将char转换为字符串呢?
Bluefire 2012年

“在上述问题中,用“字符”表示的不是char数据类型”,我不会读成“我不会接受 char
2012年

@Bluefire看看我的回答。Character.toString应该可以工作(这是从Character的类。
里卡多·阿尔塔米拉诺


5

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

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

但是,substring()说实话,这并不是真正的“整洁” 。



4

这是正确的代码。如果您使用的是zybook,则可以解决所有问题。

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

0

如果有人在苦苦挣扎,代码是:

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

这将返回位置1处的char,在这种情况下,请记住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的a是期望的,而不是 a char
威廉·普赖斯

建议使用其他6个答案,包括被接受的答案,charAt()作为可能的解决方案。这个答案增加了什么?
丹·盖茨

6
另外,您似乎暗示要charAt()使用从1开始的索引,因为a在第三位置只有唯一的字符。如果那是真的,那么对您说或解释比暗示它会更好。实际上并非如此:charAt()使用从0开始的索引,因此s将是'h'
丹·盖茨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.