Оператор Continue не продолжает цикл for - PullRequest
0 голосов
/ 05 декабря 2018

Попытка продолжить итерацию if (str1Number == str2Number), но цикл останавливается после увеличения переменной i

String getOldestVersion (String str1, String str2) {
    String[] str1Arr = str1.split("\\.");
    String[] str2Arr = str2.split("\\.");
    String result = "";
    int str1Number = 0;
    int str2Number = 0;

    for (int i = 0; i < str1Arr.length-1; i++) {
        str1Number = Integer.valueOf(str1Arr[i]);
        str2Number = Integer.valueOf(str2Arr[i]);
        if (str1Number > str2Number) {
            result = str1;
            break;
        } else if (str1Number == str2Number) {
            i++;
            continue;
        } else {
            result = str2;
            break;
        }
    }

    return (result);
} 

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

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

Для этого должно хватить ниже.Никаких циклов не требуется

public class Foo {
  public static void main(String[] args) {
    System.out.println(getOldestVersion("abc.12", "abc.14"));
  }
  public static String getOldestVersion(String v1, String v2) {
    return parseInteger(v1) > parseInteger(v2) ? v2 : v1;
  }

  public static int parseInteger(String input) {
    return Integer.valueOf(input.replaceAll("\\D", ""));
  }
}

Если ваша входная строка похожа на 12.13.14.15, вы можете использовать

public class Foo {
  public static void main(String[] args) {
    System.out.println(getOldestVersion("12.18", "14.15"));
  }
  public static String getOldestVersion(String v1, String v2) {
    return Stream.of(v1.split("\\.")).mapToInt(Integer::parseInt).min().orElse(Integer.MAX_VALUE) > Stream.of(v2.split("\\.")).mapToInt(Integer::parseInt).min().orElse(Integer.MAX_VALUE)
        ? v2 : v1;
  }

  public static int parseInteger(String input) {
    return Integer.valueOf(input.replaceAll("\\D", ""));
  }
}
0 голосов
/ 05 декабря 2018

Ключевое слово continue просто отправляет управление наверх цикла (после выполнения инкрементной части конструкции for).Однако условие все еще оценивается, поэтому оно будет продолжать цикл, только если условие цикла выполнено.

Возможно, в вашем случае i < str1Arr.length-1 равно false.

0 голосов
/ 05 декабря 2018

Как сказано в комментариях "использование продолжения в качестве последнего оператора в цикле не имеет никакого смысла".почему?

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

похоже, что вы хотите, если это условие истинно -> if (str1Number == str2Number), тогда вы не хотите выполнять какую-либо логику в цикле, в этом случае вы можете сделать:

for (int i = 0; i < str1Arr.length-1; i++){ // did you mean i < str1Arr.length ? 
       str1Number = Integer.valueOf(str1Arr[i]);
       str2Number = Integer.valueOf(str2Arr[i]);
       if (str1Number == str2Number) // <---- I've moved it to here 
            continue;
       if (str1Number > str2Number) {
             result = str1;
             break;
       } else {
             result = str2;
             break;
       }
}

Я также удалил i++;, который был внутри блока if, поскольку я "предположил", что это могло быть опечаткой / ошибкой.

0 голосов
/ 05 декабря 2018

Поскольку сама операция continue говорит об увеличении итерации variable - i, вам не нужно увеличивать ее там.Вы можете просто написать:

else if (str1Number == str2Number){
      continue;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...