尝试匹配字符串模式

时间:2017-03-30 19:48:53

标签: java string

给定一个字符串,如果字符串中的第一个“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;
}

4 个答案:

答案 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个字符。