#java
#java
Вопрос:
Допустим, у меня есть несколько наборов слов, таких как: (вода, мука, яйца) и (бобы, вода, молоко)
Если пользователь вводит строку, содержащую все эти слова в любом порядке, отображается сообщение. Например, «У меня есть яйца, вода и немного муки» -> «Из этого получается пирог».
Каков наиболее эффективный способ добиться этого, предполагая, что может существовать большое количество наборов слов и комбинаций сообщений для проверки, для каждой строки, которую вводит пользователь.
Моя первоначальная идея — использовать .contains:
for(each-word-set)
{
i = word-set.length;
for(each-word)
{
if(string.contains(word))
{
j
}
}
if(i == j)
{
//Yes this string contains all words.
}
}
Есть ли лучший метод, чем этот?
Комментарии:
1. Загляните в aho-corasick.
2. Я еще не уверен, я предполагаю, что hashmap?
3. Содержит ли строка, вводимая пользователем, какие-либо разделители? Например, мука, бобы и т.д.?
4. Пробелы между каждым словом будут действовать как разделители.
5. Вам следует подумать
if(string.contains(word)){j }else{break;}
… Завершает цикл, если цель недостижима. Как следствие, вы можете удалить тестi==j
. Если вы достигнете этой точки, все всегда будет в порядке.
Ответ №1:
Мой первоначальный способ: использование пробела в качестве разделителя.
Мы можем сделать следующее.
Шаги
Создайте список. Следующим образом
1) Используйте функцию разделения Java. Для создания массива.
List<String> list = new ArrayList<String>(Arrays.asList(string.split(" ")))`;
2) Создайте хэш-карту.
Map<String, String> hash = new HashMap<String, String>();
for(i = 0 ; i < list.length(); i )
{
hash.put(list[i], list[i]);
}
Где list[i]
будет вашим ключом.
3) Извлеките совпадения.
Теперь, когда пользователь вводит слово, которое вас интересует, вы можете использовать команду containsKey
. Например
if (hash.containsKey("flour") amp;amp; hash.containsKey("water") amp;amp; hash.containsKey("beans");
println("Whatever you want");
Следует отметить, что создание хэш-таблицы полезно для больших наборов данных. Вот ссылка, вы должны посмотреть, чтобы увидеть преимущества. Извлечение данных из хэш-таблицы составляет O (1), поэтому выполняется практически мгновенно.
Надеюсь, это было полезно.
Ответ №2:
Чтобы дополнить мой комментарий. Было допущено еще несколько ошибок. Мое окончательное решение на данный момент было бы:
public class Someclass {
public static void main(String[] args) {
String[] words = { "water", "flour", "eggs", "beans", "water", "milk" };
String[] testStrings = { "water flour eggs beans water milk", "somewhat else",
"wader flour ekks beans water milk" };
for (String string : testStrings) {
boolean found = true;
for (String word : words) {
if (!string.contains(word)) {
found = false;
break;
}
}
if (found) {
System.out.println(string " - That makes a cake");
} else {
System.out.println(string " - That makes no cake");
}
}
}
}
Ответ №3:
You can first create an array or list of strings splitted by space as:
List<string>userStr= userEntry.split(" ");
Now use extended for loop within another loop as:
for(String s: userStr)
{
for(String d: yourList){
if(s.equals d){
//your code
break;
}
}
}