Использование оператора IF для управления оператором возврата? - PullRequest
0 голосов
/ 13 апреля 2011
public static int seqSearch(int numRecords, String[] stuName,
      double[] stuGpa, String nameKey, double gpaKey)

        for(int i = 0; i < numRecords; i++)
           if(stuName[i] == nameKey && stuGpa[i] == gpaKey)
              return i;
        return -1;

Итак, как бы я использовал оператор if для управления этим? Я делаю последовательный поиск, чтобы найти, найдено ли имя в массиве, и если gpa находится в массиве, то он должен вернуть позицию, в которой он был найден в (i). Но все, что он делает, это возвращает -1 и распечатывает, что ничего не было найдено.

Ответы [ 9 ]

3 голосов
/ 13 апреля 2011

У вас есть две отдельные проблемы здесь:

  1. Вы должны сравнивать строки, используя equals() метод (или одну из его родственных связей) -в противном случае вы сравниваете, являются ли две строки одной и той же ссылкой (экземпляром), а не эквивалентными последовательностями символов.
  2. Следует избегать сравнения пар, используя ==, поскольку равенство для пар более нюансировано.Проверьте этот документ для получения дополнительной информации о причинах.

См. этот вопрос о том, почему использование == для сравнения с плавающей запятой - плохая идея в Java.

Помимо этого, я бы также отметил, что ваша реализация предполагает, что и stuName, и stuGpa являются массивами одинаковой длины.Это легко может быть не так ... и, вероятно, это то, что стоит утверждать, прежде чем вы начнете перебирать массивы.

1 голос
/ 13 апреля 2011

Строки должны сравниваться с .equals в Java, а не ==.

if(stuName[i].equals (nameKey) && stuGpa[i] == gpaKey)
0 голосов
/ 13 апреля 2011

Чтобы на самом деле ответить на вопрос о контроле над оператором if ...

Я полагаю, что то, что вы делаете, хорошо с множественными операторами возврата, НО ...

Я лично предпочитаю одну точку входа и только одну точку выхода для моих методов. Мне всегда кажется грязным иметь несколько точек выхода.

Итак, я бы рассмотрел следующий код:

public static int seqSearch(int numRecords, String[] stuName, double[] stuGpa, String nameKey, double gpaKey)

    int value = -1;

    for(int i = 0; i < numRecords; i++) {  // Don't forget your braces, they aren't required, but wait until you add a newline and forget to add them...
       if(some.boolean().equals(comparison.here())) {
          value = i;
          break;
       }
    }
    return value;
}

Удачи.

0 голосов
/ 13 апреля 2011

Ваша проблема не в условном операторе if, а в условном операторе ==.== относится к значению указателя объекта, где метод .equals возвращает что-то, вычисленное объектом.

Как все говорили ранее, переключите ваш == на .equals в следующей строке:

public static int seqSearch(int numRecords, String[] stuName,
  double[] stuGpa, String nameKey, double gpaKey)

    for(int i = 0; i < numRecords; i++)
       if(stuName[i].equals(nameKey) && stuGpa[i] == gpaKey)
          return i;
    return -1;
0 голосов
/ 13 апреля 2011

Следующее верно для оператора if.stuName [i] - это строка, поэтому сравните ее с .equals.stuGpa [i] является двойным, поэтому используйте ==.

if(stuName[i].equals(nameKey_ && stuGpa[i] == gpaKey)
0 голосов
/ 13 апреля 2011

Существенной проблемой является то, что

stuName[i] == nameKey

сравнивает только, являются ли объекты одним и тем же строковым объектом в памяти.

Вы действительно хотите использовать nameKey.equals(stuName[i]), чтобы сравнить фактическиестроковые значения.И вы можете использовать .equalsIgnoreCase для нечувствительности к регистру.

0 голосов
/ 13 апреля 2011

Вы сравниваете две строки.Строки неизменны.Пожалуйста, используйте «equalsIgnoreCase ()» или «equals ()» для сравнения строк

См. Примеры здесь http://www.java -samples.com / showtutorial.php? Tutorialid = 224

0 голосов
/ 13 апреля 2011

if(stuName[i] == nameKey вряд ли будет правильным, вы сравниваете идентификаторы объектов, а не содержимое строки.Попробуйте if(stuName[i].equals(nameKey)

0 голосов
/ 13 апреля 2011

Вы, вероятно, хотите

if (stuName[i].equals(nameKey) && stuGpa[i].equals(gpaKey))
...