Проверить массив строк на вхождение в строку
Дан массив строк, например: ["молоко", "мама", "масло"], дана строка: "Я купил масло", нужно найти элемент(ы) массива, которые входят в строку, как лучше реализовать? Первое что приходит в голову:
List<String> str = new ArrayList<>();
List<String> result = new ArrayList<>();
for (String s : str) {
if (stroka.contains(s)) {
result.add(s);
}
}
return result;
может есть еще какой-то способ?
Ответы (1 шт):
Автор решения: Alex Rudenko
→ Ссылка
Если нужно сравнивать отдельные слова, а не просто их вхождение во входную строку, то последнюю следует разбить на слова, исключив небуквенные символы, (опционально) привести все слова к единому регистру, собрать эти слова в Set<String> и затем отфильтровать список слов по условию их вхождения в данное множество:
static void printWords(String stroka, List<String> str) {
Set<String> words = Arrays.stream(stroka.split("\\P{L}+"))
.map(String::toLowerCase)
.collect(Collectors.toSet());
System.out.println(words);
List<String> result = str.stream()
.filter(words::contains)
.collect(Collectors.toList());
System.out.println(result);
}
Для тестовых данных:
printWords("Мама мыла раму, я купил масло.", Arrays.asList("мама", "масло", "молоко"));
Результат:
[масло, мама, купил, мыла, раму, я]
[мама, масло]
Можно решить это и без Stream API, используя обычный метод List::retainAll:
static void printWordsNoStream(String stroka, List<String> str) {
Set<String> words = new HashSet<>(Arrays.asList(
stroka.toLowerCase().split("\\P{L}+")
));
System.out.println(words);
List<String> result = new ArrayList<>(str); // изменяемая копия str
result.retainAll(words); // удаляем из result всё, что не входит в words
System.out.println(result);
}