Проверьте правильность каждого символа в строке - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь создать метод в java, который бы определял, правильно ли сформирована строка.Каждый символ в строке должен быть равен одному из предопределенных символов и ничего больше.Первый символ должен быть равен одному из значений в первом массиве.Второй символ должен быть равен одному из значений в массиве столбцов.Третий символ должен быть равен одному из значений в массиве строк.Четвертый символ должен быть равен одному из значений в четвертом массиве.У меня пока есть этот кодздесь не так?

Спасибо

Ответы [ 4 ]

0 голосов
/ 25 августа 2018

Вы использовали вложенные циклы 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;
}

Если вам нужен более быстрый метод, вы можете использовать Hashset и сэкономить время на зацикливание.

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;
0 голосов
/ 25 августа 2018

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/

0 голосов
/ 25 августа 2018

Поскольку ваш вопрос Что здесь не так? , давайте посмотрим:

  1. Ваши циклы вложены перед проверкой каждого символа, вызывая ненужные проверки.Подсказка: вам не нужно вводить циклы для 2-го, 3-го или 4-го символа, когда 1-й недействителен.

  2. Два из этих массивов содержат int с, а неchar s, но вы просто сравниваете char s в String со значениями int, что не работает.

  3. Вы сравниваете свои счетчики с length+1 вместо length, выходя за пределы.(Длина этих массивов не length+1, а length.)

  4. У вас есть бесконечный цикл для любого неверного String, который начинается хотя бы с одного действительного символа, поскольку вы только увеличиваете счетчик в ветви else, но не имеете условия break / return для частично недействительного String.

0 голосов
/ 25 августа 2018

Все ваши проверки индекса должны быть

< first.length; 

, а не

< first.length+1; 

и т.д ...

Например, ваш первый массив равен 0..11и вы получаете доступ к 12.

BTW Добро пожаловать в стек переполнения!

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