Get string character by index - Java
我知道如何计算一个字符串中某个字符或数字的索引,但是我是否可以使用任何预定义的方法在第n个位置给我这个字符?所以在字符串"foo"中,如果我请求索引为0的字符,它将返回"f"。
注意-在上面的问题中,"character"不是指char数据类型,而是字符串中的字母或数字。这里重要的是,当调用方法时,我不会收到char,而是一个字符串(长度为1)。我知道substring()方法,但我想知道是否有更整洁的方法。
你要找的方法是
1 2 3 |
有关更多信息,请参见EDCOX1 Oracle 3中的Java文档。如果你想要另一个简单的教程,这个或这个。
如果不想将结果作为
1 2 3 |
如果您想要更多关于
你要的是
这里有一个教程
1 | "mystring".charAt(2) |
返回EDOCX1[1]
如果您非常热衷于拥有一个字符串,那么有几种方法可以将一个字符转换为一个字符串:
或
1 |
甚至
例如。
考虑到你的要求,你很难接受
对于用于编码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 ????????"; |
字符迭代
第一种解决方案是对字符串的所有
1 2 3 4 5 6 7 8 9 10 11 |
代码点迭代
第二个解决方案也使用显式循环,但访问单个使用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之外的字符。另一方面,其他两个解决方案很好地处理代理对。
可以使用
1 | String.valueOf(myString.charAt(3)) // This will return a string of the character on the 3rd position. |
它简单如下:
1 |
将
1 |
但老实说,这并不比
这是正确的代码。如果你使用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 |