Как проверить, является ли строка двоичной в Java - PullRequest
0 голосов
/ 26 марта 2020
   /**
     * Given a String as input, return true if the String represents a valid
     * binary value (i.e. contains only the digits 1 and 0). Returns false if
     * the String does not represent a binary value.
     *
     * @param value
     *            A String value that may contain a binary value
     * @return true if the String value contains a binary value, false otherwise
     */

Независимо от того, что я делаю, он возвращает только ложь. Я новичок в программировании и не понимаю, как работает logi c. Спасибо за любую помощь.

public static boolean validBinary(String value) {

    int b = Integer.parseInt(value);
    int binCount = 0;
    for(int i = 0; i < value.length(); i++) {
        int tempB = value.charAt(i);
        if(tempB % 10 == 0 || tempB % 10 == 1) {
            binCount = binCount + 1;
        }
        else {
            binCount = -1;
            break;
        }
    }
    if (binCount > 0) {
        return true;
    }
    else {
        return false;
    }

}

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Я считаю, что ваша проблема здесь: int tempB = value.charAt(i); Вы конвертируете tempB в char, который приводится к int. Но это преобразует его в значение ASCII int, поэтому каждый символ '0' приводится к 48, а каждое значение '1' - к 49. Примечание: ни 48, ни 49 не равны нулю или одному модулю 10, поэтому ничего не добавляется в корзину.

Вам необходимо преобразовать каждый символ в его действительное целочисленное значение (а именно, ноль или единицу), используя String.valueOf или Character.getNumericValue:

https://www.javatpoint.com/java-char-to-int

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

1 голос
/ 26 марта 2020

Вот пошаговый анализ вашей программы.

public static boolean validBinary(String value) {

Избавьтесь от следующего, поскольку оно не используется.

    int b = Integer.parseInt(value);

Инициализация binCount и запуск l oop.

    int binCount = 0;
    for(int i = 0; i < value.length(); i++) {
        int tempB = value.charAt(i);

Вот здесь и начинается проблема. Даже если tempB объявлено как int, оно все равно имеет значение символа ASCII. Таким образом, от 0 до 9 на самом деле составляют от 48 до 57 включительно. Поэтому вместо преобразования в целые числа просто сравните их, поскольку они существуют, которые являются символами. В этом случае вы можете забыть оператор%. Таким образом, новый оператор if должен быть:

    if (tempB == '0' || tempB == '1') {

вместо

    if(tempB % 10 == 0 || tempB % 10 == 1) {

Сохраните оставшуюся часть кода, и программа будет работать нормально.

      binCount = binCount + 1;
    }
    else {
            binCount = -1;
            break;
        }
    }
    if (binCount > 0) {
        return true;
    }
    else {
        return false;
    }
}

Возможные улучшения

Весь смысл упражнения - проверить, является ли число двоичным. Таким образом, вам не нужна бухгалтерия, например bincount. Как только ваш тест на 0 или 1 не пройден, просто верните false. Нет необходимости в дальнейшей обработке. Но если вы закончили sh проверку всей строки и не провалили тест, тогда все символы должны быть 0 или 1. Так что верните true. Это будет выглядеть следующим образом.

  for(int i = 0; i < value.length(); i++) {
        int tempB = value.charAt(i);
        if (tempB == '0' || tempB == '1') {
             continue; // process next character.
                       // continue skips rest of loop
         }
         return false;
   }
   // no failures, so
   return true;

Альтернативные логики c без continue могут быть:

  for(int i = 0; i < value.length(); i++) {
        int tempB = value.charAt(i);
        if (tempB != '0' && tempB != '1') {
             return false;
         }
   }
   // no failures, so
   return true;
...