【问题标题】:Java ternary operator on simple binary search problem简单二分搜索问题的Java三元运算符
【发布时间】:2022-01-23 05:25:55
【问题描述】:

如何重构此代码以不包含“int ans =” 我想保留三元运算符。由于 int ans 实际上不是答案,因此保持这种方式毫无意义。

使用三元运算符更改左/右值的正确方法是什么?

public class Main {
    public static void main(String[] args) {

        int[] nums = {-1, 0, 3, 5, 9, 12};
        System.out.println(search(nums, 0));

    }

    public static int search(int[] nums, int target) {
        int middle, left = 0, right = nums.length - 1;
        while (left <= right) {
            middle = left + (right - left) / 2;
            if (nums[middle] == target) return middle;
            int ans = (nums[middle] < target) ? (left = middle + 1) : (right = middle - 1);
        }
        return -1;
    }
}

【问题讨论】:

  • 另外,当我删除 'int ans = ' 时,代码无法编译。
  • 如果ans在上面的代码中没有任何用法,就不能直接删除吗?我不太确定这个问题的去向。您能否简要描述一下预期ans的目的?
  • 将三元运算符转换为if 语句?
  • 有道理!这就是我最初写它的方式,但很好奇这是否可以通过三元运算符实现?
  • 您不能将三元运算符用作独立表达式。它与基本的 i + 1; 相同,它也不会自行编译

标签: java binary-search conditional-operator


【解决方案1】:

条件运算符只能用作表达式的一部分。表达式不能独立存在,但必须是语句的一部分。分配一个变量是一个语句。计算一个值而不是存储它,不是。将表达式转换为语句:

int ans = (nums[middle] < target) ? (left = middle + 1) : (right = middle - 1);

变成:

if (nums[middle] < target) {
  left = middle + 1;
} else {
  right = middle - 1;
}

如果你想节省几个击键:

if (nums[middle] < target) left = middle + 1;
else right = middle - 1;

JLS 的相关链接:

【讨论】:

  • 这是一个很棒的解释,我刚刚也根据这篇文章的 cmets 发布了我自己的答案!谢谢!
【解决方案2】:

由于我的背景主要是 JavaScript/TypeScript,我试图在 Java 中提出一个类似的解决方案:

const binarySearchArr = (arr: number[], target: number): number => {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    let middle = left + Math.floor((right - left) / 2);

    if (arr[middle] === target) {
      return middle;
    }
    arr[middle] < target ? (left = middle + 1) : (right = middle - 1);
  }

  return -1;
};

根据 QBrute 的评论,我必须保留“int ans =”的原因是因为 Java 不支持将三元运算符用作独立表达式。

【讨论】:

  • Java != JavaScript。 JavaScript 在语法上要灵活得多。 allowed &amp;&amp; callMethod(); 在 JavaScript 中有效,但在 Java 中无效。甚至callback &amp;&amp; callback(); 也是一个有效的声明。
  • 你知道一个很好的资源来了解它们为什么不同吗?我很想知道为什么一种语言支持它而另一种语言不支持
  • 为什么 Java 和 JavaScript 不同?因为它们是独立创建的不同语言。不要让自己被“JavaScript”中的“Java”所迷惑。这类似于问“为什么英语与法语不同?” – 因为它们是不同的语言。两种语言(Java 和 JavaScript,不是英语和法语)的语言和语法规范都是公开可用的,阅读它们会很有趣:)
  • 谢谢 knittl,我的意思是关于每种语言在后台工作的方式,为什么我们可以在 Java 中做某些我们在 JavaScript 中做不到的事情(反之亦然)。
猜你喜欢
  • 2011-10-24
  • 2018-06-06
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2015-05-20
相关资源
最近更新 更多