こんにちは。
以下、考え方とコードの一例です。
"ABCDEFG"
に含まれる長さ 3 の部分文字列は、以下の5個あります。
"ABC"
"BCD"
"CDE"
"DEF"
"EFG"
チェック対象の文字列が、これらの 5個をどれも含まなければ判定 OK 、
1つでも含んでいれば判定 NG を返すメソッドを書けばよいです。
この考え方を実装したコードが以下です。
public class Tera109831 {
static final int CHECK_LENGTH = 3;
public static void main(String[] args) {
String checkedUser = "ABCDEFG";
String[] newUsers = new String[]{"ABC123", "12DEF3", "AB3DE5"};
for (String user: newUsers) {
String result = check(user, checkedUser, CHECK_LENGTH);
System.out.printf(
"newUser: %s, checkedUser: %s: result:%s\n",
user, checkedUser, (result != null ? "NG[" + result + "]": "OK"));
}
}
/**
* 文字列 b に含まれる長さ len の部分文字列のどれかをaが含むかどうかを判定
*
* 返り値:
* 含まない場合: null
* 含む場合: aが含むbの部分文字列
*/
private static String check(String a, String b, int len) {
for (int i = 0; i < b.length()- len; ++i) {
String s = b.substring(i, i + len);
if (a.indexOf(s) >= 0)
return s;
}
return null;
}
}
上記をコンパイル、実行すると以下が出力されます。
newUser: ABC123, checkedUser: ABCDEFG: result:NG[ABC]
newUser: 12DEF3, checkedUser: ABCDEFG: result:NG[DEF]
newUser: AB3DE5, checkedUser: ABCDEFG: result:OK
ただし、上記のコードの check
メソッドは a
または b
がnull
の
場合や、len
が b
の長さ以上だった場合、あるいは0以下の場合にも
エラーにならず適切な結果を返すようにはなっていないので、完全なものに
するには、これらに対応するコードを追加する必要があります。
以上参考になれば幸いです。
追記
最近の Java の関数型の記法を使えば、もっと短いコードで書けるかもしれませんが、
この回答の主目的は、質問の解法として
"ABCDEFG"
に含まれる長さ 3 の部分文字列を、先頭の "ABC"
から順に作っていき、
それらのいずれかを、チェック対象の文字列が含むかどうか?を判定すればよい。
という考え方を提示することです。
追記2
私の回答の終わりに
完全なものにするには、これらに対応するコードを追加する必要があります。
と書いています。
これは、言い換えると、回答に挙げたcheck
メソッドは、
この回答のコメントにある、
2018/01/20 11:15
aやbがnullだった場合はNullPointerExceptionが、
lenがbの長さを超えていたらIndexOutOfBoundsExceptionがちゃんと発生すると思います。
といった実行時例外の発生について考慮したものになっていない、という意味です。
(ただし、これらの例外が起きないようにパラメータをチェックするコードを
書くことは、ご質問の本題ではないので、回答のコードには含めませんでした。)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/20 02:41 編集
2018/01/20 04:05 編集
2018/01/20 05:12
2018/01/20 05:13