265

我知道如何计算出字符串中某个字符或数字的索引,但是有什么预定义的方法可以用来给我第 n 个位置的字符吗?所以在字符串“foo”中,如果我询问索引为 0 的字符,它将返回“f”。

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

4

12 回答 12

383

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

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

有关详细信息,请参阅有关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 的文档中提取了我的信息。

于 2012-06-27T15:39:30.920 回答
49

你要.charAt()

这是一个教程

"mystring".charAt(2)

返回s

如果您非常想拥有一个字符串,有几种方法可以将 char 转换为字符串:

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

或者

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

甚至

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

例如。

于 2012-06-27T15:39:24.500 回答
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 之外的字符。另一方面,其他两个解决方案可以很好地处理代理对。

于 2015-11-07T22:40:01.047 回答
8

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

于 2012-06-27T15:40:24.960 回答
8

您可以使用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.
于 2012-06-27T15:45:31.660 回答
5

它很简单:

String charIs = string.charAt(index) + "";
于 2012-06-27T15:52:02.660 回答
5

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

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

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

于 2012-06-27T15:45:48.967 回答
4

这是正确的代码。如果您使用的是 zybooks,这将解决所有问题。

for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at " + i);
    }
}
于 2015-11-21T16:51:15.740 回答
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

于 2019-07-29T13:12:59.730 回答
0

CodePointAt 而不是 charAt 使用起来更安全。当 strtng 中有表情符号时,charAt 可能会中断。

于 2020-08-27T16:05:13.443 回答
0

CharAt 功能不起作用

Edittext.setText(YourString.toCharArray(),0,1);

此代码工作正常

于 2021-02-09T13:51:20.783 回答
-3

像这样:

String a ="hh1hhhhhhhh";
char s = a.charAt(3);
于 2015-05-13T18:43:45.577 回答