检查字符串中的每个字符是否有效

时间:2018-08-25 16:16:03

标签: java arrays loops methods statements

我试图在Java中创建一个方法来判断字符串是否格式正确。字符串中的每个字符应等于预定义字符之一,而不能等于其他任何字符。 第一个字符应等于第一个数组中的值之一。 第二个字符应等于columns数组中的值之一。 第三个字符应等于rows数组中的值之一。 第四个字符应等于第四个数组中的值之一。 到目前为止,我已经有了这段代码。

public static boolean formedGoodOrNot(String input) {
    char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
    int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
    char[] rows = {'A', 'B', 'C', 'D'};
    int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
    if(input.length()==4) {
      for (int j = 0; j < first.length+1; ) {
        for (int k = 0; k < columns.length+1; ) {
          for (int l = 0; l < rows.length+1; ) {
            for (int m = 0; m < fourth.length+1; ) {
              if (input.charAt(0) == first[j]) {
                if (input.charAt(1) == columns[k]) {
                  if (input.charAt(2) == rows[l]) {
                    if (input.charAt(3) == fourth[m]) {
                      return true;
                    } else{
                      m++;
                    }
                  } else {
                    l++;
                  }
                } else{
                  k++;
                }
              } else{
                j++;
              }
            }
          }
        }
      }
    } else{
      return false;
    }
    return false;
  }

但是,它给了我一个错误

  

java.lang.ArrayIndexOutOfBoundsException:12

这是怎么了?

谢谢

4 个答案:

答案 0 :(得分:1)

您已使用嵌套的for循环,这对于您的问题不是必需的。而且array.length + 1也会引发异常。应该是array.length

        char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
        int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
        char[] rows = {'A', 'B', 'C', 'D'};
        int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};

        boolean firstTest;
        boolean columnTest;
        boolean rowsTest;
        boolean fourthTest;

        if(input.length()==4) {
          for (int j = 0; j < first.length; j++){
               if (input.charAt(0) == first[j]){
                   firstTest = true;
                   break;
               }
           }
           if(!firstTest)
                 return false;

           for (int j = 0; j < columns.length; j++){
               if (input.charAt(0) == columns[j]){
                   columnsTest= true;
                   break;
               }
           }

           if(!columnTest)
                 return false;

          // Do the same for other tests as well


          // if all tests are passed
          return true;
}

如果您想要一种更快的方法,则可以使用哈希集并节省循环时间。

Set<Character> first= new HashSet<>(Arrays.asList('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'));

Set<Integer> columns= new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8));

// create other sets

if(first.contains(input.charAt(0)) && columns.contains(input.charAt(1)) && /*other similar checks*/)
    return true;
return false;

答案 1 :(得分:0)

所有索引检查都应为

< first.length; 

不是

< first.length+1; 

等...

例如,您的第一个数组是0..11,您正在访问12。

顺便说一句,欢迎使用堆栈溢出!

public static boolean formedGoodOrNot(String input) {
    char[] first = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'};
    int[] columns = {1, 2, 3, 4, 5, 6, 7, 8};
    char[] rows = {'A', 'B', 'C', 'D'};
    int[] fourth = {0, 1, 2, 3, 4, 5, 6, 7};
    if(input.length()==4) {
      for (int j = 0; j < first.length; ) {
        for (int k = 0; k < columns.length; ) {
          for (int l = 0; l < rows.length; ) {
            for (int m = 0; m < fourth.length; ) {
              if (input.charAt(0) == first[j]) {
                if (input.charAt(1) == columns[k]) {
                  if (input.charAt(2) == rows[l]) {
                    if (input.charAt(3) == fourth[m]) {
                      return true;
                    } else{
                      m++;
                    }
                  } else {
                    l++;
                  }
                } else{
                  k++;
                }
              } else{
                j++;
              }
            }
          }
        }
      }
    } else{
      return false;
    }
    return false;
  }

答案 2 :(得分:0)

REGEX

您应该为此使用正则表达式!匹配此模式的正则表达式为:

^[a-l][1-8][A-D][0-7]$

现在您只需要将此插入功能即可:

 private static final Pattern PATTERN = Pattern.compile("^[a-l][1-8][A-D][0-7]$");


 public boolean formedGoodOrNot(String input) {
     return PATTERN.matcher(input).matches();
 }

到那里,比您的实现更具可读性和简短性!

编辑

要了解此正则表达式的工作原理,请查看解释该正则表达式的链接:https://regex101.com/r/SDlnzi/1/

答案 3 :(得分:0)

既然您的问题是这是什么问题?,让我们来看一下:

  1. 在检查每个字符之前,您的循环是嵌套的,从而导致不必要的检查。提示:如果第一个字符无效,则无需输入第二个,第三个或第四个字符的循环。

  2. 其中两个数组包含int,而不包含char,但您只需将char中的String与{{1} }的值,这是行不通的。

  3. 您将计数器与int而不是length+1进行比较,因此超出了范围。 (这些数组的长度不是length,而是length+1。)

  4. 对于任何以至少一个有效字符开头的无效length,您都有一个无限循环,因为您只增加String分支中的计数器,而没有{{1} } / else的条件,部分无效的break