文字列をテストして、配列の文字列が含まれているかどうかを確認するにはどうすればよいですか?
使用する代わりに
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
文字列をテストして、配列の文字列が含まれているかどうかを確認するにはどうすればよいですか?
使用する代わりに
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
回答:
編集:Java 8ストリーミングAPIを使用したアップデートです。とてもきれい。正規表現と組み合わせることもできます。
public static boolean stringContainsItemFromList(String inputStr, String[] items) {
return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}
また、入力タイプを配列ではなくリストに変更すると、を使用できますitems.parallelStream().anyMatch(inputStr::contains)
。
.filter(inputStr::contains).findAny()
一致する文字列を返したい場合にも使用できます。
元のわずかに日付の付いた回答:
これは(非常に基本的な)静的メソッドです。比較文字列では大文字と小文字が区別されることに注意してください。原始それケース小文字を区別しないを作るための方法は、呼び出すことであろうtoLowerCase()
か、toUpperCase()
両方の入力およびテスト文字列に。
あなたはこれ以上複雑何もする必要がある場合は、私が見て推薦するパターンとMatcherのクラスといくつかの正規表現を行う方法を学びます。それらを理解したら、それらのクラスまたはString.matches()
ヘルパーメソッドを使用できます。
public static boolean stringContainsItemFromList(String inputStr, String[] items)
{
for(int i =0; i < items.length; i++)
{
if(inputStr.contains(items[i]))
{
return true;
}
}
return false;
}
import org.apache.commons.lang.StringUtils;
使用する:
StringUtils.indexOfAny(inputString, new String[]{item1, item2, item3})
見つかった文字列のインデックスを返すか、見つからない場合は-1を返します。
次のようにString#matchesメソッドを使用できます。
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
最も簡単な方法は、おそらく配列をjava.util.ArrayListに変換することです。それがarraylistに含まれると、containsメソッドを簡単に活用できます。
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
string
が含まれているかどうかを尋ねています。String
String
string
.equals()
投稿で使用しているため、非常に混乱しています。彼らは質問を編集する必要があると思います
Java 8以降を使用している場合は、Stream APIを使用してそのようなことを行うことができます。
public static boolean containsItemFromArray(String inputString, String[] items) {
// Convert the array of String items as a Stream
// For each element of the Stream call inputString.contains(element)
// If you have any match returns true, false otherwise
return Arrays.stream(items).anyMatch(inputString::contains);
}
String
テストするbigの大きな配列があるとすると、を呼び出して検索を並行して起動することもできるとするとparallel()
、コードは次のようになります。
return Arrays.stream(items).parallel().anyMatch(inputString::contains);
ここに1つの解決策があります:
public static boolean containsAny(String str, String[] words)
{
boolean bResult=false; // will be set, if any of the words are found
//String[] words = {"word1", "word2", "word3", "word4", "word5"};
List<String> list = Arrays.asList(words);
for (String word: list ) {
boolean bFound = str.contains(word);
if (bFound) {bResult=bFound; break;}
}
return bResult;
}
よりグルーヴィーなアプローチは、metaClassと組み合わせてinjectを使用することです:
私は言いたいと思います:
String myInput="This string is FORBIDDEN"
myInput.containsAny(["FORBIDDEN","NOT_ALLOWED"]) //=>true
そして、方法は次のようになります:
myInput.metaClass.containsAny={List<String> notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
containsAnyを将来のString変数に含める必要がある場合は、オブジェクトではなくメソッドをクラスに追加します。
String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
これを試して:
if (Arrays.asList(item1, item2, item3).stream().anyMatch(string::contains))
単語全体 を検索する場合は、大文字と小文字を区別せずにこれを行うことができます。
private boolean containsKeyword(String line, String[] keywords)
{
String[] inputWords = line.split(" ");
for (String inputWord : inputWords)
{
for (String keyword : keywords)
{
if (inputWord.equalsIgnoreCase(keyword))
{
return true;
}
}
}
return false;
}
次のようにすることもできます:
if (string.matches("^.*?((?i)item1|item2|item3).*$"))
(?i): used for case insensitive
.*? & .*$: used for checking whether it is present anywhere in between the string.
以下は、文字列が検索対象の配列であると想定して機能するはずです。
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
mykeytosearchは、配列内に存在するかどうかをテストする文字列です。mysearchComparator-文字列を比較するために使用されるコンパレータです。
詳細については、Arrays.binarySearchを参照してください。
if (Arrays.asList(array).contains(string))