Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查字符串是否包含存储在字符串数组中的多个值_Java_Arrays_Regex_String - Fatal编程技术网

Java 检查字符串是否包含存储在字符串数组中的多个值

Java 检查字符串是否包含存储在字符串数组中的多个值,java,arrays,regex,string,Java,Arrays,Regex,String,我正在尝试编写一个程序,检查字符串是否包含多个必须按特定顺序出现的单词。这些单词存储在字符串数组中 这就是我迄今为止所取得的成就 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 (i

我正在尝试编写一个程序,检查字符串是否包含多个必须按特定顺序出现的单词。这些单词存储在字符串数组中

这就是我迄今为止所取得的成就

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! ");
}
布尔检查=false;
扫描仪S=新的扫描仪(System.in);
System.out.println(“您的问题是什么?”);
字符串输入=S.nextLine();
String[]Words={“pay”,“car”};

对于(int i=0;i您可以将它们组合成一个正则表达式检查。您已经在(使用
*
)之前或之后匹配了任何字符,所以基本上只需将正则表达式字符串连接成一个检查

if(input.matches(“.*\\b”+单词[0]+“\\b.*\\b”+单词[1]+“\\b.*))

编辑:回应“在我的代码中,我也使用了单词[I]和单词[1],但当我得到更大的单词列表时,这不起作用,我尝试使用嵌套循环,但它不起作用。”

您可以在输入字上迭代以创建正则表达式字符串。
String regexpatern=“.\\b”+String.Join(“\\b.\\b”,Words)+“\\b.”;

编辑2:以下是我的答案和编辑组合,代码中有更多上下文:

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:将Words.Join()替换为String.Join(),因为我可以使用Java而不使用编译器real gud。

我假设您总是查找以空格分隔的单词,因此可以使用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);
Map Map=newhashmap();
String[]words={“pay”,“car”};
for(int i=0;i
所以现在你只需要迭代你的输入词,检查所有的词都在那里,并且你没有违反顺序,这个时间复杂度是O(n)

int lastFoundIndex=-1;
int numFound=0;
for(int i=0;i=words.length)//此条件表示我们在不违反顺序的情况下允许超过个事件发生
系统输出打印项次(“30000美元”);
其他的
System.out.println(“错误信息!”);

您不需要迭代输入单词,只需生成完整的正则表达式:

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

为什么要阻止两个问题的答案相同,我认为它们应该是相同的,两个问题都以正确的顺序从数组中有多个单词,当你说“多个”时,你的意思是两个以上吗?很抱歉,我编辑了案例2。即使字符串“car comed first then string”pay“它将显示相同的答案。我所说的多个单词是指一个包含2个以上单词的数组,我如何比较答案的答案,但这将导致与我们使用单词[1](数组的索引1)相同的问题,但后来当我在数组中获得更多单词时,我无法继续使用单词[1],单词[2]正如我在主要的主题中提到的,我尝试使用嵌套循环,但是它并没有在WHOLTEND注释中工作:因为您只是直接连接用户输入,如果用户使用任何保留的正则表达式字符,用户可能会有奇怪的行为。在连接之前,您可能需要考虑跳过输入。显然,有一种Pattern.quote方法。我会这样做:更新的答案带有接受任意数量输入单词的代码段。我不理解您的编辑?您能解释一下吗?您表示需要接受任意数量的单词作为输入,所以我的编辑只是将所有输入单词与
\\b.*\\b
连接起来,以生成一个正则表达式,与中的整组单词匹配顺序。这样您就不需要硬编码任何单词输入的索引。这对于只有{“pay”,“car”}的情况非常有效在单词数组中,但当有超过2个单词时,用户必须输入所有单词才能得到答案?此解决方案与数组中的单词数无关,它将为匹配项生成适当的正则表达式。用户必须像以前一样输入句子,这对您的情况不合适吗?我编辑了我的解决方案使用更紧凑的正则表达式生成SomeHow my ide接受String.join并且它工作得非常好,谢谢!您需要Java 8才能使用if(map.get(inputWords[i])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