Ex。 .comはamazon.comに存在します それは逆の順序で仕事を含んでいます それは "amazon.com"を確認します.contains( "。com) しかし、私は .COMがamazon.comに含まれているかどうかを確認する必要があります 私はそれがします真の最後の文字列が一致し大きな文字列に部分文字列が存在することをJavaで直接チェックできますか
答えて
使用して、正規表現
をチェックする(.COM、.ORG、等)のような値のリストを持っているよう。
String str = "amazon.com";
System.out.println(str.matches(".*(com|org|in)"));
値が増加する場合 –
値は重要ではなく、常にbrace(com | org | in)にある最後の終了文字列をチェックします。 – Vinod
私は思いますあなたはうんざりするそして、あなたがcharをご入力文字列内のすべての文字をループして見つけることができます
convert
[".com", ".org"]
to
[
'.': [
'c': [
'o': [
'm': []
]
],
'o': [
'r': [
'g': []
]
]
]
]
:それを行うには
private boolean checkUrl(String url, List<String> suffixes) {
boolean isValid = false;
//Loop through all the correct suffixes
for(String suffix : suffixes) {
//If the suffix exists then we can set the variable to true and break the loop so we can return true.
if(url.endsWith(suffix)) {
isValid = true;
break;
}
}
return isValid;
}
これは1Mの値をチェックする必要が非常に遅いです –
一つの方法は、このような何かにあなたの検索アルゴリズムを分割することです。このようなトン何かその個々のチャーの木。 その後、木の端まで歩いていくことができます。ある時点で空の地図が見つかると、一致するものが見つかりました。まったく地図が見つからない場合は、それは一致しません。
このクラスは、検索ツリーをコンパイルし、いくつかの入力
public class CharSearch
{
private final Map<Character, CharSet> charSets;
public CharSearch(String[] values)
{
charSets = new HashMap<>();
for (String value : values)
addValue(value);
}
public void addValue(String value)
{
addValue(value.toCharArray(), 0);
}
public void addValue(char[] value, int index)
{
if (value == null || value.length == 0)
return;
CharSet charSet = charSets.computeIfAbsent(value[index], k -> new CharSet());
charSet.addValue(value, index +1);
}
public String toString()
{
return getClass().getName() + charSets.toString();
}
public int match(String input)
{
char[] characters = input.toCharArray();
for (int i = 0; i < characters.length; i++)
{
CharSet charSet = charSets.get(characters[i]);
if (charSet != null)
{
if (charSet.match(characters, i) >= 0)
return i;
else
break;
}
}
return -1;
}
}
class CharSet
{
final Map<Character, CharSet> nextChars;
boolean isLocked = false;
CharSet()
{
this.nextChars = new HashMap<>();
}
public String toString()
{
return nextChars.toString();
}
void addValue(char[] value, int index)
{
if (isLocked)
return;
if (value.length <= index)
{
isLocked = true;
nextChars.clear();
return;
}
CharSet charSet = nextChars.computeIfAbsent(value[index], k -> new CharSet());
charSet.addValue(value, index +1);
}
int match(char[] input, int index)
{
if (nextChars.isEmpty())
return index;
index++;
if (input.length <= index)
return -1;
CharSet charSet = nextChars.get(input[index]);
if (charSet != null)
{
return (charSet.match(input, index));
}
return -1;
}
}
と一致するメソッドを持っていますこれは、あなたがコンパイル「または」と「ORG」ならば、組織は単純に無視されることを前提としています。 ".blablabla1"と ".blablabla2"をコンパイルすると、 ".blablabla"は1回のみチェックされます。 なぜなら、なぜなら、matchメソッドは最初に見つかった一致のインデックスを返します。
String[] values = {".com", ".org",};
CharSearch charSearch = new CharSearch(values);
System.out.println(charSearch.match("amazon.com"));
System.out.println(charSearch.match("amazon.cooo"));
"6"と "-1"が表示されます。
私は(この場合は2)をチェックするための非常に少ない値で、これは実際にこのような単純な何かを行うよりも遅くなることを想定しています
public static boolean hasAny(String text, String[] values)
{
for (String value : values)
{
if (text.contains(value))
return true;
}
return false;
}
しかし、あなたはチェック以上の値、より多くのSearchCharのアプローチが効率的になり、hasAny()アプローチの効率が低下します。 (になってきて、より効率的なdoesntのは、ランタイムが下がることを意味していることに注意してください。)
あなたが一緒に一つだけの子供とのマッピングを設定することにより、このアルゴリズムを最適化することができます。
[
'.': [
'com': [],
'org': []
]
]
またはのための長さのチェックを追加することにより、文字列の残りの長さに比べて、各ツリーの最小限の長さ(char型[])あなたは
を評価するか、いくつかの高知能の予測で複数の文字をスキップしている...をしかし、これはすべき)
EDIT: すべての入力(たとえば、)がドットで始まるときに効率が上がります。 簡単なチェックでは、入力の文字数をn、一致の開始文字を見つけるためにチェックする値の数をnとしたとき、O(n * t)になります。
CharSearchでは、一致の開始文字を見つけるのにO(n)が必要です。 O(n *(1〜L))の最終的な複雑さでは、Lはあなたが入れた値の最大長です。これは誤解しない限りString.contains()と同じ複雑さです。
(その大きなO記法はしかし、右の表記ではないかもしれないが、私はそれを理解する人々のためにかなり明確であるべきだと思います。)
- 1. 長い文字列に存在するファジー/近似部分文字列をPythonでチェックしていますか?
- 2. 大きな文字列から部分文字列を取得するR
- 3. この文字列をどのように部分文字列にすることができますか?
- 4. 特定の部分文字列が存在する場合は文字列を置き換えますか?
- 5. 文字列の一部が文字列の一部をjavascriptの数字にすることができる文字列から文字列を削除する
- 6. 文字列が ";"で終わるときの部分文字列エラーまたは ""
- 7. 文字列と部分文字列とメイン文字列に含まれる部分文字列の数
- 8. XMLファイルに文字列を直接挿入することができます
- 9. Python:部分文字列の存在
- 10. Java:部分文字列を<b>部分文字列で置換する</b>大文字と小文字を区別しない
- 11. 文字列を部分文字列に置き換える
- 12. 文字列を文字列で分割するときのエラー
- 13. .htaccessは部分文字列を削除しますが、クエリ文字列を保持しますが、部分文字列はルートに存在します。
- 14. 文字列テンプレートを '\ n'まで削除する大きい文字列 - Java
- 15. 巨大な文字列から部分文字列を抽出する
- 16. 直接重複する部分文字列を解析する
- 17. 部分一致文字列を太字文字列に置き換えます。
- 18. 分割大きな文字列を
- 19. 条件付きで大きな文字列を分割する
- 20. ディクショナリの文字列キーで文字列の部分一致を行うことはできますか?
- 21. 大きな文字列の部分列の検索
- 22. メッセージの部分文字列の部分文字列の部分文字列
- 23. Python find()は文字列の先頭に部分文字列を見つけることができません
- 24. Java:特定の文字をインデックスの文字列の部分文字列に置き換えます。
- 25. 文字列で文字列を分割できない
- 26. 文字列の部分文字列を置換する方法Javaの空の部分文字列 ""(部分文字列を削除する)
- 27. Javaの文字を部分文字列にする
- 28. 大きな文字列で特定の文字列をフィルタリングしますか?
- 29. 文字列が各文字の数と同じになるように置き換えることができる最小の部分文字列
- 30. 文字列を部分文字列に分割するc
'文字列#1 endsWith'? –
なぜcontains()に答えがないのですか? – Wietlol
'' amazon.com ".contains("。com) 'はあなたが望むものを正確に実行します – Jens