我知道如何计算出字符串中某个字符或数字的索引,但是有什么预定义的方法可以用来给我第 n 个位置的字符吗?所以在字符串“foo”中,如果我询问索引为 0 的字符,它将返回“f”。
注意 - 在上面的问题中,“字符”不是指 char 数据类型,而是字符串中的字母或数字。这里重要的是,当调用该方法时我没有收到一个字符,而是一个字符串(长度为 1)。我知道 substring() 方法,但我想知道是否有更简洁的方法。
char
值?而且他知道如何做substring()
,但只是想要一种“更整洁”的方式。仅供参考,我可以说 substring()
是最简洁的方式。
Character.toString
满足所有必要的要求,而且一点也不凌乱。
substring()
并没有太大区别。
String.substring(int, int)
的 endIndex
(第二个参数)是一个独占索引,它不会为 index + 1
抛出异常,只要 index < length()
- - 即使对于字符串中的最后一个字符也是如此。
您正在寻找的方法是 charAt
。这是一个例子:
String text = "foo";
char charAtZero = text.charAt(0);
System.out.println(charAtZero); // Prints f
有关详细信息,请参阅 Java documentation on String.charAt
。如果您想要另一个简单的教程,this one 或 this one。
如果您不希望将结果作为 char
数据类型,而是作为字符串,则可以使用 Character.toString
方法:
String text = "foo";
String letter = Character.toString(text.charAt(0));
System.out.println(letter); // Prints f
如果您想了解有关 Character
类和 toString
方法的更多信息,我从 the documentation on Character.toString 中提取了我的信息。
你想要.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));
例如。
Character.toString
更可取吗?
String mychar = String.valueOf("mystring".charAt(2));
String mychar = ""+"mystring".charAt(2);
,因为它是最简洁的。其他人对此会有不同的看法。
建议的答案都不适用于用于编码 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 之外的字符。另一方面,其他两个解决方案可以很好地处理代理对。
考虑到您的要求,您非常坚持使用 substring()
。标准方式是 charAt()
,但您说您不会接受 char 数据类型。
toString()
无法使用它,而 valueOf()
仅适用于数字(我想,我可能错了),那么如何将 char 转换为字符串?
char
”
Character.toString
应该可以工作(它是来自 Character
类的静态方法。
您可以使用 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.
将 charAt
与您不获取 char 的要求相结合的混合方法可能是
newstring = String.valueOf("foo".charAt(0));
但老实说,这并不比 substring()
真正“整洁”。
它很简单:
String charIs = string.charAt(index) + "";
这是正确的代码。如果您使用的是 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 中的字符,在这种情况下 k 记住,索引从位置 0 开始,所以在这个示例中:kotlin 将是 k=位置 0,o=位置 1,t=位置 2,l=位置 3, i=位置 4 和 n=位置 5
CodePointAt 而不是 charAt 使用起来更安全。当 strtng 中有表情符号时,charAt 可能会中断。
CharAt 功能不起作用
Edittext.setText(YourString.toCharArray(),0,1);
此代码工作正常
像这样:
String a ="hh1hhhhhhhh";
char s = a.charAt(3);
String
,而不是 char
。
charAt()
作为可能的解决方案。这个答案增加了什么?
charAt()
使用基于 1 的索引,因为 a
中唯一不同的字符位于第三个位置。如果这是真的,那么你最好说或解释这一点,而不是暗示它。实际上,这不是为真:charAt()
使用从 0 开始的索引,因此 s
将是 'h'
。