给定一个字符串,如果字符串中的第一个“x”实例紧跟另一个“x”,则返回true。它不适用于doubleX(“axxbb”)的情况。它应该返回true但是给出错误。
boolean doubleX(String str) {
for (int i = 0; i < str.length(); i++) {
if (str.substring(i) == "x") {
if ( str.substring(i) == str.substring(i + 1)){
return true;
}
}
}
return false;
}
答案 0 :(得分:1)
boolean doubleX(String str){
if (str == null){
return false; //defensively check that the input is not null
}
int firstX = str.indexOf("x");
if(firstX >=0 && firstX < str.length()-1){ //this ensures that we actually found an x and that there is at least 1 more character after it
return str.charAt(firstX+1) == 'x'; //return true if the next char is an x
}
return false; //otherwise return false
}
答案 1 :(得分:0)
str.substring(i)
没有做你认为它做的事情 - 它返回一个子字符串,而不是字符编号i
。
改为使用str.charAt(i)
。
答案 2 :(得分:0)
substring方法为你提供了字符串结尾的i的子字符串。例如:
str = "test string";
System.out.println(str.substring(3));
会给你一个从3到字符串末尾的字符串(&#34; t string&#34;)
而不是子串使用charAt:https://www.tutorialspoint.com/java/java_string_charat.htm
答案 3 :(得分:0)
对于doubleX(“axxbb”)的情况不起作用。它应该返回true但是给出错误。
您的代码存在一些问题:
if (str.substring(i) == "x") {
String.substring(...)
方法返回位置i
处启动的字符串部分。引用javadocs:
返回一个新字符串,该字符串是此字符串的子字符串。子字符串以指定索引处的字符开头,并延伸到此字符串的末尾。
因此,如果您str.substring(1)
str
"axxbb"
substring
,那么"xxbb"
将返回str.charAt(i)
。我认为您应该使用if (str.charAt(i) == 'x') {
...
}
来返回该位置的字符。所以你的代码应该是:
==
第二个概念问题是字符串无法与String
进行比较。 ==
是一个对象,当对象与string.equals("x")
进行比较时,您将比较对象的引用而不是其内容。要比较字符串,您应该使用str.charAt(i)
。见answer for more details。
但是,再次,你想在这里做str.charAt(i + 1)
。
最后,你的代码在最后一个字符上会出现问题,因为你是一个StringIndexOutOfBoundsException
的字符串,它会抛出一个// subtract one from the length because we are looking for 2 x's in a row
for (int i = 0; i < str.length() - 1; i++) {
。所以循环应该是:
str.length() - 1
我们转到// Which one is more performant?
foreach (Foo foo in someListOfFoo)
{
foo.Update();
}
// Or...
updateFoos(); // updateFoos is an event
,因为我们正在寻找连续2个字符。