通过索引获取string – Java
我知道如何计算string中某个字符或数字的索引,但是有没有什么预定义的方法可以用来给我在第n个位置的字符呢? 所以在string“foo”中,如果我要求索引为0的字符,它会返回“f”。
注意 – 在上面的问题中,“字符”我不是指字符数据types,而是string中的字母或数字。 这里最重要的是当方法被调用时,我没有收到一个字符,而是一个string(长度为1)。 我知道substring()方法,但我想知道是否有一个更好的方法。
你正在寻找的方法是charAt
。 这是一个例子:
String text = "foo"; char a_char = text.charAt(0); System.out.println( a_char ); // Prints f
有关更多信息,请参阅String.charAt
上的Java文档 。 如果你想要另一个简单的教程, 这一个或这一个 。
如果您不想将结果作为char
数据types,而是将其作为string使用,则可以使用Character.toString
方法:
String text = "foo"; String a_letter = Character.toString(text.charAt(0)); System.out.println( a_letter ); // Prints f
如果你想了解更多关于Character
类和toString
方法的信息,我从Character.toString的文档中抽取了我的信息。
你想.charAt()
这是一个教程
"mystring".charAt(2)
返回s
如果你有一个string,有几种方法可以将字符转换为string:
String mychar = Character.toString("mystring".charAt(2));
要么
String mychar = ""+"mystring".charAt(2);
甚至
String mychar = String.valueOf("mystring".charAt(2));
例如。
根据您的要求,您可以坚持使用substring()
。 标准的方法是charAt()
,但是你说你不会接受一个char数据types。
您可以使用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.
简单来说,
String charIs = string.charAt(index)+"";
把charAt
与你不要char的要求结合起来的混合方法可能是
newstring = String.valueOf("foo".charAt(0));
但是说实话,这并不比substring()
更“整洁”。
所提出的答案都不适用于在Unicode Basic Multiligual Plane之外用于编码字符的代理对。
下面是一个使用3种不同技术遍历string的“字符”(包括使用Java 8streamAPI)的示例。 请注意,此示例包含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 𓊃𓍿𓅓𓃡";
字符迭代
第一种解决scheme是对string的所有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 }
迭代代码点
第二个解决scheme也使用显式循环,但使用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迭代代码点
第三个解决scheme与第二个解决scheme基本相同,但使用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 });
结果
当您运行该testing程序时,您将获得:
Using char iterator (do not work for surrogate pairs !) T hequickbrown ? ? jumpsoverthelazy ? ? ? ? ? ? ? ? Using Java 1.5 codePointAt(works as expected) T hequickbrown 𓃥 jumpsoverthelazy 𓊃 𓍿 𓅓 𓃡 Using Java 8 stream (works as expected) T hequickbrown 𓃥 jumpsoverthelazy 𓊃 𓍿 𓅓 𓃡
正如你所看到的(如果你能正确显示象形文字),第一个解决scheme不能正确处理Unicode BMP以外的字符。 另一方面,另外两种解决scheme可以很好地处理代理对。
这是正确的代码。 如果你使用zybooks这将回答所有的问题。
for(int i = 0;i<passCode.length();i++) { char letter = passCode.charAt(i); if(letter == ' ' ) { System.out.println("Space at " + i); } }
喜欢这个:
String a ="hh1hhhhhhhh"; char s = a.charAt(3);