通过索引获取字符串字符

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

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

1077903 次浏览

你需要.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));

为例。

你要找的方法是charAt。这里有一个例子:

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

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

如果你不希望结果是char数据类型,而是一个字符串,你可以使用Character.toString方法:

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

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

鉴于你的需求,你会被substring()困住。标准的方法是charAt(),但你说你不会接受char数据类型。

你可以使用String.charAt(int index)方法结果作为字符串。返回对象的值(char c)的参数。

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

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

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

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

它是如此简单:

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

是这样的:

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

对于用于对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.
}

使用流API迭代代码点

第三个解决方案基本上与第二个解决方案相同,但使用java8stream 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之外的字符。另一方面,其他两种解都能很好地处理代理对。

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

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

如果有人正在与kotlin作斗争,代码是:

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

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

CharAt函数不工作

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

这段代码运行良好