Как мне сравнить две строки разной длины и вернуть false только для 1 недопустимого символа?

#java

#java

Вопрос:

 public boolean setValidColor(String input, String colors) {
    int exists;
    isValidColor = true;
    char[] colorch = colors.toCharArray();
    Arrays.sort(colorch);
    for(int i = 0; i < input.length(); i  )
    {
        exists = Arrays.binarySearch(colorch, input.charAt(i));
        if(exists == -1)
        {
            isValidColor = false;
            break;
        }
    }  
    return isValidColor;
}
  

У меня возникли проблемы при сравнении двух строк разной длины и возврате false только при 1 экземпляре недопустимого ввода..

Например: возможные цвета — RGOPYB, а входные цвета — YZOR. ‘Z’ невозможно, и мне нужно закодировать, чтобы вернуть false, но код продолжает возвращать true. Где я ошибаюсь?

редактировать: В этом коде есть нечто большее, чем просто это (выполнение ООП), это просто метод, с которым у меня постоянно возникают проблемы.

Комментарии:

1. Не могли бы вы перефразировать это как … что-то, что имеет смысл? Вы сравниваете String s с String.equals() … может показаться, что вы пытаетесь сделать что-то совсем другое, чем это.

2. Вы слишком усложняете это…

3. я полагаю, что он обрабатывает строку как набор символов, и поэтому порядок не имеет значения.

4. Я думаю, вы можете сделать это в 1-2 строках с регулярным выражением, если оно просто проверяет правильность.

5. Я пробовал разные способы сравнения. Я выполнил вложенные циклы for для сравнения двух строк, и я попытался выполнить цикл while. Имеющийся у меня код является самым последним из имеющихся.

Ответ №1:

Arrays.binarySearch вернет -1, только если искомое значение должно быть вставлено в позицию 0. Для других значений, которые не найдены, он возвращает другие отрицательные значения. Проверьте на exist < 0 вместо exists == -1 .

Комментарии:

1. Итак, я попытался это сделать. Я не упоминал об этом, но есть еще несколько условий, которые должны быть выполнены. Для того, что я делаю, я сгенерировал случайный 4-буквенный символ из возможного списка, и мой ввод должен быть возможными символами и принимать значение true, если он соответствует списку из 4 букв. Допустим, я должен сравнить свой ввод, BORG, с BORG и убедиться, что в списке есть допустимые символы. Должно получиться значение true, но оно продолжает возвращать false.

2. Если вы имеете дело только с четырехбуквенными тестами, то двоичный поиск излишен. Просто используйте что-то подобное для вашего метода: for (int i=input.length() - 1; i >= 0; --i) if (colors.indexOf(input.charAt(i)) == -1) return false; return true;

Ответ №2:

Из java.util.Массивы: индекс ключа поиска, если он содержится в массиве; в противном случае, (-(точка вставки) — 1). Означает, что ваше условие должно быть:

    if(exists < 0)
  

Ответ №3:

Я думаю, что Тед Хопп обнаружил вашу проблему.


Я просто хотел бы отметить, что ваш текущий подход (сортировка и использование двоичного поиска), вероятно, будет значительно медленнее, чем простой O(N^2) алгоритм, использующий colors.indexOf(input.charAt(i)) . Вы можете улучшить ситуацию, «подняв» создание отсортированного массива символов. (Или, может быть, просто потребовать, чтобы colors строка была отсортирована в качестве предварительного условия.) Но даже с этим изменением indexOf подход все равно будет быстрее, если цветовой массив достаточно мал.

Мораль этого заключается в том, что оптимизация (особенно преждевременная оптимизация) может ухудшить ситуацию, если вы не включите реалистичную характеристику ожидаемых данных.

(Теперь, возможно, «RGOPYB» не указывает на фактическое количество цветов. Но если это так, вы должны сказать нам …)

Ответ №4:

Возможно, вы захотите преобразовать это в списки. Затем вы можете использовать retainAll или removeAll и посмотреть, является ли список пустым / тем же самым.

Что-то вроде:

  List validInput=   input.retainAll(colors);
if(validInput.equals(input)) {
 return true;
} 
return false;