0

文字列に「.xyz」がある場合は常にfalseを返すコードを書いていますが、ピリオドのないxyzがある場合はtrueを返します。これを除いて、ほとんどのテストはパスします:

xyzThere("abc.xyzxyz")

このテストも合格するように修正する方法はありますか? 私のコードは以下です。

public boolean xyzThere(String str) {
  for (int i = 0; i < str.length() - 2; i++) {
    if (str.charAt(i) == '.') {
      if (str.substring(i+1, i+4).equals("xyz")) {
        return false;
      }
    }
    else if (str.substring(i, i+3).equals("xyz")) {
      return true;
    }
  }
  return false;
}
4

2 に答える 2

0

「xyz」も含まれていない限り、false 「.xyz」をString含むものを返したいと思います。

これを行うには、最初に「.xyz」をチェックします。そこにない場合は完了です。そこにある場合は、すべての「.xyz」を削除し、単に「xyz」を確認します

public static void main(String[] args) {
    System.out.println(hasXyz("abc"));
    System.out.println(hasXyz("abc.xyz"));
    System.out.println(hasXyz("abcxyz"));
    System.out.println(hasXyz("abc.xyzxyz"));

}

public static boolean hasXyz(final String in) {
    if(in.contains(".xyz")) {
        final String s = in.replaceAll("\\.xyz", "");
        return s.contains("xyz");
    }
    return true;
}

出力:

true
false
true
true
于 2013-03-17T14:34:04.283 に答える
0

正規表現を使用します。パフォーマンスが心配な場合は、メソッドの外でパターンを作成してください。書くだけ

private boolean xyzThere(String string) {
    return string.matches("xyz.*|.*[^.]xyz.*");
}

あなたは大丈夫です。

于 2013-03-17T14:33:37.593 に答える