关于按索引获取字符串字符:通过索引获取字符串字符 – Java

Get string character by index - Java

我知道如何计算一个字符串中某个字符或数字的索引,但是我是否可以使用任何预定义的方法在第n个位置给我这个字符?所以在字符串"foo"中,如果我请求索引为0的字符,它将返回"f"。

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


你要找的方法是charAt。下面是一个例子:

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

有关更多信息,请参见EDCOX1 Oracle 3中的Java文档。如果你想要另一个简单的教程,这个或这个。

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

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

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


你要的是.charAt()

这里有一个教程

1
"mystring".charAt(2)

返回EDOCX1[1]

如果您非常热衷于拥有一个字符串,那么有几种方法可以将一个字符转换为一个字符串:

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

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

甚至

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

例如。


考虑到你的要求,你很难接受substring()。标准的方法是charAt(),但您说过不会接受char数据类型。


对于用于编码Unicode基本多语言平面外字符的代理项对,所有建议的答案都不起作用。

下面是一个使用三种不同的技术来迭代字符串的"字符"的例子(包括使用Java 8流API)。请注意,此示例包含Unicode补充多语言平面(SMP)的字符。您需要一个合适的字体来正确显示这个例子和结果。

1
2
3
4
// 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
2
3
4
5
6
7
8
9
10
11
/* 1 */
System.out.println(
       "

Using 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的代码点,并相应增加循环索引的字符数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* 2 */
System.out.println(
       "

Using 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.
}

使用流API迭代代码点

第三个解决方案基本上与第二个解决方案相同,但是使用Java 8流API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 3 */
System.out.println(
       "

Using 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
    });

结果

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

1
2
3
4
5
6
7
8
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之外的字符。另一方面,其他两个解决方案很好地处理代理对。


可以使用String.charAt(int index)方法result作为string.valueof(char c)的参数。

1
String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position.

它简单如下:

1
String charIs = string.charAt(index) +"";


charAt与不获取char的要求相结合的混合方法可以是

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

但老实说,这并不比substring()更"整洁"。


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

1
2
3
4
5
6
7
8
for (int i = 0; i<passCode.length(); i++)
{
    char letter = passCode.charAt(i);
    if (letter == ' ' )
    {
        System.out.println("Space at" + i);
    }
}

这样地:

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