通过索引获取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);