Как проверить строку, чтобы увидеть, содержит ли она какие-либо строки из массива?
Вместо использования
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Как проверить строку, чтобы увидеть, содержит ли она какие-либо строки из массива?
Вместо использования
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
EDIT: это обновление с использованием Java 8 Streaming 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()
на входных и тестовых строках.
Если вам нужно сделать что-то более сложное, я бы рекомендовал посмотреть 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, если ни один не найден.
Вы можете использовать метод String # следующим образом:
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
Самый простой способ - преобразовать массив в java.util.ArrayList. Когда он находится в архаисте, вы можете легко использовать метод contains.
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
Попробуйте следующее:
if (Arrays.asList(item1, item2, item3).contains(string))
Если вы используете 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;
}
if (Arrays.asList(array).contains(string))
Более серьезный подход заключался бы в использовании вставки в комбинации с metaClass:
Я хотел бы сказать:
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.metaClass.containsAny={notAllowedTerms->
notAllowedTerms?.inject(false,{found,term->found || delegate.contains(term)})
}
И если вы ищете нечувствительность к регистру, используйте шаблон
Pattern pattern = Pattern.compile("\\bitem1 |item2\\b",java.util.regex.Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(input);
if(matcher.find() ){
}
String.prototype.matchWithTokens = function(tokensArray){
for(i=0; i< tokensArray.length; i++) {
if(this.indexOf(tokensArray[i]) != -1) {
return true;
}
}
return false;
};
Ниже следует работать для вас, предполагая, что Строки - это массив, который вы ищете внутри:
Arrays.binarySearch(Strings,"mykeytosearch",mysearchComparator);
где mykeytosearch - это строка, которую вы хотите проверить для существования внутри массива. mysearchComparator - это компаратор, который будет использоваться для сравнения строк.
Подробнее см. Arrays.binarySearch.