与if语句相比,如何正确构造Java的三元运算符?

问题描述 投票:1回答:2

我有一个关于相同代码的两个版本的简单问题,一个使用三元运算符,一个使用if语句,以及为什么它们的答案不同。

有关问题的背景资料。我正在尝试轻松排序整数数组并获得数组的范围(最大和最小)

给出的数组:[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语句版本的三元复制品?

java ternary-operator ternary
2个回答
1
投票

整个事情可以使用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]));
    }
}

1
投票

你有两个错误。这个:

    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语句的故事。

© www.soinside.com 2019 - 2024. All rights reserved.