有效地检查字符串是否包含一组单词

时间:2014-07-05 00:16:07

标签: 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.
  }
}

有比这更好的方法吗?

3 个答案:

答案 0 :(得分:2)

我最初的方式: 使用空格作为分隔符。

我们可以做到以下几点。

步骤

创建一个列表。如下

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") && hash.containsKey("water") && hash.containsKey("beans");

  println("Whatever you want");

需要注意的是,创建HashTable对大数据集非常有用。这是一个link,你应该看到它的好处。从哈希表中检索数据是O(1),因此几乎是瞬时的。

希望这很有帮助。

答案 1 :(得分:0)

扩展我的评论。还有一些错误。到目前为止,我的最终解决方案是:

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");
            }
        }
    }
}

答案 2 :(得分:0)

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;
        }
     }
}