我正在尝试编写一个程序来检查字符串是否包含必须按特定顺序发生的多个单词,这些单词存储在字符串数组中
这是迄今为止我所达到的目标
boolean Check = false;
Scanner S = new Scanner(System.in);
System.out.println("What is your question?");
String input=S.nextLine();
String[] Words = {"pay","car"};
for (int i = 0; i <= Words.length -1 ; i++) {
if (input.matches(".*\\b"+Words[i]+"\\b.*") && input.matches(".*\\b"+Words[1]+"\\b.*")) {
Check = true;
}
}
if (Check){
System.out.println("30k Dollar");
} else{
System.out.println("Wrong info! ");
}
基本上,我的代码所做的就是用户输入时的例子 “我应该为车付多少钱?”他会得到“30k Dollar”的答案
因为字符串“pay”和“car”都在我的字符串数组中。
案例2:如果用户输入“bla bla car bla bla pay”
他会得到同样的答案。如何阻止程序为2个不同的问题提供相同的答案?
同样在我的代码中我使用了Words [i]和Words [1]但是当我得到更大的单词列表时,这不会起作用,我尝试使用嵌套循环,但它不起作用。
答案 0 :(得分:1)
您不需要迭代输入词,只需生成完整的正则表达式:
String[] words = {"pay","car"};
String regex = ".*\\b" + String.join("\\b.*\\b", words) + "\\b.*";
String test1= "how much should i pay for the car?";
System.out.println(test1.matches(regex)); // True
String test2 = "bla bla car bla bla pay";
System.out.println(test2.matches(regex)); // False
答案 1 :(得分:0)
您可以将它们组合成一个正则表达式检查。你已经在之前或之后匹配任何字符(使用.*
),所以基本上将你的正则表达式字符串连接成一个单独的支票。
if (input.matches(".*\\b" + Words[0] + "\\b.*\\b" + Words[1] + "\\b.*"))
编辑:回复“在我的代码中我使用了Words [i]和Words [1]但是当我得到更大的单词列表时,这不起作用,我尝试使用嵌套循环,但它不起作用。”
您可以迭代输入单词以创建正则表达式字符串。
String regexPattern = ".*\\b" + String.Join("\\b.*\\b", Words) + "\\b.*";
EDIT2:这是我的答案,并在代码中编辑了更多上下文:
String[] Words = {"pay","car"};
String regexPattern = ".*\\b" + String.Join("\\b.*\\b", Words) + "\\b.*";
if (input.matches(regexPattern)) {
System.out.println("30k Dollar");
} else {
System.out.println("Wrong info!");
}
EDIT3:用String.Join()替换Words.Join()因为我可以用Java编写一个真正的gud。
答案 2 :(得分:0)
我会假设您总是寻找以空格分隔的单词,因此您可以使用split
分隔单词String inputWords[] = input.split(" ");
首先我们需要减少检查单词是否在我们的数组中的时间复杂度,这样我们就可以在一个集合中填充数组但是因为我们关心顺序,所以我们最好使用带有键的映射,并对索引进行值数组中的那个词
Map<String,Integer> map = new HashMap<>();
String[] words = {"pay","car"};
for(int i =0; i< words.length; i++)
map.put(words[i], i);
所以现在你需要的是迭代你的inputWords并检查所有单词是否存在而你没有违反顺序,这个时间复杂度是O(n)
int lastFoundIndex = -1;
int numFound =0;
for(int i=0; i < inputWords.length; i++) {
if(map.get(inputWords[i]) != null ) {
if(map.get(inputWords[i]) < lastFoundIndex)
break;
lastFoundIndex = map.get(inputWords[i]);
numFound ++;
}
}
if(numFound >= words.length) // this condition means we are allowing more than occurence without violating the order
system.out.println("30k Dollar");
else
System.out.println("Wrong info! ");