Как проверить строку, чтобы увидеть, содержит ли она какие-либо строки из массива?
Вместо того, чтобы использовать
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Как проверить строку, чтобы увидеть, содержит ли она какие-либо строки из массива?
Вместо того, чтобы использовать
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Ответы:
РЕДАКТИРОВАТЬ: Вот обновление с использованием потокового API Java 8. Так много чище. Можно комбинировать и с регулярными выражениями.
public static boolean stringContainsItemFromList(String inputStr, String[] items) {
return Arrays.stream(items).parallel().anyMatch(inputStr::contains);
}
Кроме того, если мы изменим тип ввода на List вместо массива, который мы можем использовать items.parallelStream().anyMatch(inputStr::contains)
.
Вы также можете использовать, .filter(inputStr::contains).findAny()
если хотите вернуть соответствующую строку.
Оригинальный слегка датированный ответ:
Вот (ОЧЕНЬ ОСНОВНОЙ) статический метод. Обратите внимание, что в строках сравнения он чувствителен к регистру. Примитивный способ сделать это чувствительно к регистру будет звонить toLowerCase()
илиtoUpperCase()
на обоих входных и тестовых строк.
Если вам нужно сделать что-то более сложное, чем это, я бы порекомендовал взглянуть на классы Pattern и 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, если ничего не найдено.
Возможно, самым простым способом было бы преобразовать массив в java.util.ArrayList. Как только он окажется в массиве, вы можете легко использовать метод содержимого.
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
string
есть ли String
в массиве s, а не содержится ли в массиве String
s 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
для тестирования, вы также можете запустить поиск параллельно с помощью вызова parallel()
, тогда код будет выглядеть так:
return Arrays.stream(items).parallel().anyMatch(inputString::contains);
Вот одно из решений:
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;
}
Начиная с версии 3.4 Apache Common Lang 3 реализует метод containsAny .
Более groovyesque подход будет использовать инъекционный в сочетании с метаклассом :
Я бы с удовольствием сказал:
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)})
}
Если вы хотите, чтобы в любой будущей переменной String присутствовал containsAny, добавьте метод к классу вместо объекта:
String.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
Попробуй это:
if (Arrays.asList(item1, item2, item3).stream().anyMatch(string::contains))
Если вы seraching для целых слов вы можете сделать это , что работает случай без учета регистра .
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.
Ниже должно работать для вас, предполагая, что Strings - это массив, в котором вы ищете:
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
где mykeytosearch - строка, которую вы хотите проверить на существование в массиве. mysearchComparator - это компаратор, который будет использоваться для сравнения строк.
Обратитесь к Arrays.binarySearch для получения дополнительной информации.
if (Arrays.asList(array).contains(string))