如何检查用户字符串输入是否包含在2个字符串中?

时间:2017-07-07 13:24:13

标签: java string

这个问题似乎令人困惑。程序执行此操作:它要求用户以char形式输入,然后将其存储在2个变量中。我已经创建了2个字符串。一个包含字母a-g,另一个包含字母h-o。这些基本上是用户可以去的2条路线,但是用户不能将例如“a”作为开头而“h”作为目的地,因为它们来自不同的字符串。他/她必须在同一个字符串中有起始和目的地。如果start和destination不在同一个String中,则会出错。

这个方法我看起来如下:

private void neueRoute() {
    Scanner in = new Scanner(System.in);

    String bereich1 = "aAbBcCdDeEfFgG";
    String bereich2 = "hHiIjJkKlLmMnNoO";
    char start = ' ';
    char ziel = ' ';
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;

    System.out.println("Themenbereich 1: Bahn A - G: ");
    System.out.println("\nA\nB\nC\nD\nE\nF\nG\n");
    System.out.println("Themenbereich 2: Bahn H - O: ");
    System.out.println("\nH\nI\nJ\nK\nL\nM\nN\nO");

    while((a == 0 && b == 0) || (c == 0 && d ==0)){

        System.out.println("Put in a starting point please: ");
        start = in.next().charAt(0);

        while(start != 'a' && start != 'A' && start != 'b' && start != 'B' &&
              start != 'c' && start != 'C' && start != 'd' && start != 'D' && 
              start != 'e' && start != 'E' && start != 'f' && start != 'F' && 
              start != 'g' && start != 'G' && start != 'h' && start != 'H' && 
              start != 'i' && start != 'I' && start != 'j' && start != 'J' && 
              start != 'k' && start != 'K' && start != 'l' && start != 'L' && 
              start != 'm' && start != 'M' && start != 'n' && start != 'N' && 
              start != 'o' && start != 'O') {
            System.out.println("Put in a correct starting point please: ");
            start = in.next().charAt(0);
        }

        System.out.println("Put in a destination point please: ");
        ziel = in.next().charAt(0);

        while(ziel != 'a' && ziel != 'A' && ziel != 'b' && ziel != 'B' &&
              ziel != 'c' && ziel != 'C' && ziel != 'd' && ziel != 'D' && 
              ziel != 'e' && ziel != 'E' && ziel != 'f' && ziel != 'F' && 
              ziel != 'g' && ziel != 'G' && ziel != 'h' && ziel != 'H' && 
              ziel != 'i' && ziel != 'I' && ziel != 'j' && ziel != 'J' && 
              ziel != 'k' && ziel != 'K' && ziel != 'l' && ziel != 'L' && 
              ziel != 'm' && ziel != 'M' && ziel != 'n' && ziel != 'N' && 
              ziel != 'o' && ziel != 'O') {
            System.out.println("Put in a correct destination point please: ");
            ziel = in.next().charAt(0);
        }

        a = bereich1.indexOf(start);
        b = bereich2.indexOf(ziel);

        c = bereich2.indexOf(start);
        d = bereich1.indexOf(ziel);

    }
}

我今天尝试使用.indexOf(),我在这里使用while循环:

while((a == 0 && b == 0) || (c == 0 && d ==0)){

这些变量:

a = bereich1.indexOf(start);
b = bereich2.indexOf(ziel);

c = bereich2.indexOf(start);
d = bereich1.indexOf(ziel);

我无法让它工作,而且它已经在我的脑海里工作了几天。非常感谢任何帮助或精确指向正确的方向。如果我有任何不足之处或您需要更多信息,请告诉我。

谢谢。

5 个答案:

答案 0 :(得分:1)

您可以替换:

while(start != 'a' && start != 'A' && start != 'b' && start != 'B' &&
          start != 'c' && start != 'C' && start != 'd' && start != 'D' && 
          start != 'e' && start != 'E' && start != 'f' && start != 'F' && 
          start != 'g' && start != 'G' && start != 'h' && start != 'H' && 
          start != 'i' && start != 'I' && start != 'j' && start != 'J' && 
          start != 'k' && start != 'K' && start != 'l' && start != 'L' && 
          start != 'm' && start != 'M' && start != 'n' && start != 'N' && 
          start != 'o' && start != 'O') {
       System.out.println("Put in a correct starting point please: ");
       start = in.next().charAt(0);
}

通过:

//matches a letter between a and o in lower case or not
while (!start.matches("\\b[a-oA-O]\\b")) { 
       System.out.println("Put in a correct starting point please: ");
       start = in.next().charAt(0);
}

答案 1 :(得分:0)

您正在使用bereich1.indexOf(start) == 0,这相当于bereich1.startsWith(""+start),即您不检查字符串是否包含另一个字符串,而是是否另一个字符串开头。

你真正想要使用的是bereich1.contains(""+start),所以你的while循环看起来像这样:

while (bereich1.contains(""+start) && bereich2.contains(""+ziel)
       || bereich2.contains(""+start) && bereich1.contains(""+ziel)) {

PS:为了检查一个字符是否在'a'和'o'之间,你可以使用if ('a' <= ziel && ziel <= 'o' || 'A' <= ziel && ziel <= 'O')而不是你的巨大if语句。

答案 2 :(得分:0)

您可以使用contains()函数检查其中一个字符串是否包含输入。从那里,您可以确定用户开始使用哪个字符串,然后检查该字符串以确保它们在同一个字符串中输入目的地。

private void neueRoute() {
    Scanner in = new Scanner(System.in);

    String bereich1 = "aAbBcCdDeEfFgG";
    String bereich2 = "hHiIjJkKlLmMnNoO";
    char start = ' ';
    char ziel = ' ';

    System.out.println("Themenbereich 1: Bahn A - G: ");
    System.out.println("\nA\nB\nC\nD\nE\nF\nG\n");
    System.out.println("Themenbereich 2: Bahn H - O: ");
    System.out.println("\nH\nI\nJ\nK\nL\nM\nN\nO");

    System.out.println("Put in a starting point please: ");
    start = in.next().charAt(0);

    // make sure the starting character exists in either string
    while(!bereich1.contains(start) && !bereich2.contains(start)) {
        System.out.println("Put in a correct starting point please: ");
        start = in.next().charAt(0);
    }

    // determine which string the starting character exists in
    String chosen = bereich1.contains(start) ? bereich1 : bereich2;

    System.out.println("Put in a destination point please: ");
    ziel = in.next().charAt(0);

    // make sure the ending character exists in the chosen string
    while(!chosen.contains(ziel)) {
        System.out.println("Put in a correct destination point please: ");
        ziel = in.next().charAt(0);
    }
}

答案 3 :(得分:0)

使用正则表达式! 不要在字符串上迭代以识别模式。

示例:

Pattern pattern = Pattern.compile("<your string/char>"); 
boolean containsInFrisrt  = pattern.matcher(str1).matches();  
boolean containsInSeconds = pattern.matcher(str2).matches();  

答案 4 :(得分:0)

要确定单个字符是否在某个范围内,您不需要正则表达式,也不需要很长的检查列表。您可以将char与数字进行比较(它们确实是数字)。

 char start = input.charAt(0);
 if( start >= 'a' && start <= 'o' ) {
     // do stuff
 }

要使其不区分大小写,请在比较前将其转换为大小写:

 char start = Character.toLowerCase(input.charAt(0));

我建议花几个小时阅读Javadocs中的通用课程,例如StringCharacterMath等等,本着发现“可能的方法”的精神派上用场,并且对你可以期待找到的那种方法有一个普遍的感觉。