Возвраты и / или разрывы в середине цикла.Это когда-либо приемлемо? - PullRequest
1 голос
/ 12 июля 2011

Предположим, у нас есть массив целых чисел. Мы написали функцию для извлечения индекса первого указанного значения в массиве или -1, если массив не содержит значения ..

Так, например, если array = { 4, 5, 4, 4, 7 }, то getFirstIndexOf(4) вернет 0, getFirstIndexOf(7) вернет 4, а getFirstIndexOf(8) вернет -1.

Ниже я представил три разных способа написания этой функции. Это широко распространенный стандарт кодирования, согласно которому returns в середине функций и breaks в середине циклов являются плохой практикой. Мне кажется, что это может быть приемлемым для них.

public int getFirstIndexOf(int specifiedNumber) {
  for (int i = 0; i < array.length; i++) {
    if (array[i] == specifiedNumber) {
      return i;
    }
  }

  return -1;
}

VS.

public int getFirstIndexOf(int specifiedNumber) {
  int result = -1;
  for (int i = 0; i < array.length; i++) {
    if (array[i] == specifiedNumber) {
      result = i;
      break;
    }
  }

  return result;
}

VS.

public int getFirstIndexOf(int specifiedNumber) {
  int result = -1;
  for (int i = 0; i < array.length; i++) {
    if (array[i] == specifiedNumber && result == -1) {
      result = i;
    }
  }

  return result;
}

Что вы думаете? Какой лучше? Зачем? Возможно, есть другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

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

Если вы действительно хотите избежать возврата из середины цикла, я бы рекомендовал использовать «страж», чтобы остановить цикл.

public int getFirstIndexOf(int specifiedNumber, int[] array) {

    boolean found = false;
    boolean exit = false;
    int i = 0;
    int arraySize = array.length();

    while(!found && !exit) {
        if(array[i] == specifiedNumber) {
            found = true;
        } else {
            if(i++ > arraySize) {
            exit = true;
            }
        }

    if(found ==true) {
       return i;
    } else {
       return 99999;
    }
}

edit: я ненавижу отступать код, используя пробелы в StackOverflow ...

1 голос
/ 12 июля 2011

Вот почему do ... while & , а петля была изобретена.

По запросу:

public int getFirstIndexOf(int specifiedNumber) {
    int i = array.Length;
    while(--i > -1 && array[i] != specifiedNumber);

    return i;       
}
...