Как правильно структурировать тернарный оператор Java по сравнению с операторами if? - PullRequest
1 голос
/ 03 апреля 2019

У меня простой вопрос о двух версиях одного и того же кода, одна с использованием тернарного оператора, а другая с помощью операторов if и почему они отличаются в своем ответе.

Справочная информация о проблеме. Я пытаюсь легко отсортировать массив целых чисел и получить диапазон массива (max & min)

массив дан: [6, 2, 3, 8]

Если версия выписки:

public int range(int[] num_list) {
    int[] min_max = new int[2];
    for (int i : statues) {
         if (min_max[0] == 0) {
            min_max[0] = i;
        } else {
            if (i < min_max[0]) min_max[0] = i;
        }
         if (min_max[1] == 0) {
            min_max[1] = i;
        } else {
            if (i > min_max[1]) min_max[1] = i;
        }
  System.out.println(String.valueOf(min_max[0] + " | " + min_max[1]));
    }
}

Журнал консоли:

6 | 6
2 | 6
2 | 6
2 | 8

Версия троичного оператора:

public int range(int[] num_list) {
    int[] min_max = new int[2];
    for (int i : statues) {
        min_max[0] = min_max[0] == 0 ? i 
               : (min_max[0] = i < min_max[0] ? i : i);
        min_max[1] = min_max[1] == 0 ? i 
               : (min_max[1] = i > min_max[1] ? i : i);
  System.out.println(String.valueOf(min_max[0] + " | " + min_max[1]));
    }
}

Журнал консоли:

6 | 6
2 | 2
3 | 3
8 | 8

Почему неверна версия троичного оператора? Насколько мне известно, это должна быть троичная реплика версии оператора if?

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

У вас есть две ошибки. Это:

    if (min_max[0] == 0) {
        min_max[0] = i;
    } else {
        if (i < min_max[0]) min_max[0] = i;
    }

эквивалентно этому:

    min_max[0] = min_max[0] == 0 ? i :
        (i < min_max[0] ? i : min_max[0]);

Обратите внимание, в троичном операторе "else" должно быть всегда там. Таким образом, вам нужно что-то вложить - в этом случае присвоение старого значения аналогично бездействию.

Аналогично история для второго оператора if.

1 голос
/ 03 апреля 2019

Все это можно переписать, используя if условия как:

public int range(int[] num_list) {
    int[] min_max = new int[2];
    for (int i : statues) {
        if (min_max[0] == 0 || i < min_max[0]) {
            min_max[0] = i;
        }

        if (min_max[1] == 0 || i > min_max[1]) {
            min_max[1] = i;
        }

        System.out.println(String.valueOf(min_max[0] + " | " + min_max[1]));
    }
}

Если вы действительно хотите использовать троичные выражения:

public int range(int[] num_list) {
    int[] min_max = new int[2];
    for (int i : statues) {
        min_max[0] = (min_max[0] == 0 || i < min_max[0]) ? i : min_max[0];
        min_max[1] = (min_max[1] == 0 || i > min_max[1]) ? i : min_max[1];

        System.out.println(String.valueOf(min_max[0] + " | " + min_max[1]));
    }
}
...