Як перевірити рядок, щоб побачити, чи містить він будь-який рядок із масиву?
Замість використання
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Як перевірити рядок, щоб побачити, чи містить він будь-який рядок із масиву?
Замість використання
if (string.contains(item1) || string.contains(item2) || string.contains(item3))
Відповіді:
EDIT: Ось оновлення за допомогою потокового API Java 8. Настільки чистіше. Ще можна поєднувати і з регулярними виразами.
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()
на обох вхідних і тестових рядків.
Якщо вам потрібно зробити щось складніше, ніж це, я б рекомендував переглянути класи Шаблон і Матч та навчитися робити деякі регулярні вирази. Після того, як ви зрозумієте це, ви можете скористатись цими класами або 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 # match, як цей:
System.out.printf("Matches - [%s]%n", string.matches("^.*?(item1|item2|item3).*$"));
Найпростішим способом було б, мабуть, перетворити масив у java.util.ArrayList. Після того, як він знаходиться в масиві, ви можете легко використовувати метод містить.
public static boolean bagOfWords(String str)
{
String[] words = {"word1", "word2", "word3", "word4", "word5"};
return (Arrays.asList(words).contains(str));
}
string
містить String
в масиві який-небудь String
s , а не, якщо який-небудь 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 .
Більш бурхливим підходом було б використання ін'єкцій у поєднанні з 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)})
}
Якщо вам потрібно, щоб присутній містить ContentAny для будь-якої майбутньої змінної String, тоді додайте метод до класу замість об'єкта:
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))