【问题标题】:Comparing elements of two arrays比较两个数组的元素
【发布时间】:2016-06-19 11:23:27
【问题描述】:

我的方法接受两个整数数组,如果

返回true
  1. 数组的长度和
  2. 每个 a.element 都小于同一索引的 b.element。

它适用于我的所有测试用例,int[] a = {1, 2, 3}int[] b = {4, 5, 1} 除外。即使a[2] > b[2],它也会返回true。 digitDifference 检查无法正常工作,但我看不到错误。

public static boolean allLess(int[] a, int[] b) {
    int i = 0;
    boolean sameLength = (a.length == b.length);
    boolean digitDifference = (a[i] < b[i]);
    for (i = 0; i <= a.length - 1; i++) {}
    return (sameLength && digitDifference);
}

【问题讨论】:

    标签: java arrays static-methods boolean-expression


    【解决方案1】:

    你的for 循环什么都不做,所以你只是比较数组第一个索引中的元素。

    您的代码应如下所示:

    public static boolean allLess(int[] a, int[] b) {
        boolean sameLength = (a.length == b.length);
        if (!sameLength)
            return false;
        boolean digitDifference = true;
        for (int i = 0; i <= a.length - 1 && digitDifference; i++) {
            digitDifference = (a[i] < b[i]);
        }
        return digitDifference;
    }
    

    现在 for 循环比较具有相同索引的每对元素,并在找到违反您要求的一对元素时终止 (a[i] &lt; b[i])

    另一个没有标志的等效实现:

    public static boolean allLess(int[] a, int[] b) {
        if (a.length != b.length)
            return false;
        for (int i = 0; i <= a.length - 1; i++) {
            if (a[i] >= b[i])
                return false;
        }
        return true;
    }
    

    【讨论】:

      【解决方案2】:

      digitDifference在循环之前被初始化,并比较两个数组的第一个元素,因为此时i的值为0。您永远不会比较数组的其他元素。比较必须在循环内部进行。

      顺便说一句,你的循环体甚至没有一条指令。

      【讨论】:

        【解决方案3】:

        您的方法仅比较每个数组中的第一个元素 - 比较是在 for 循环之外(它是空的!)而不是在循环内部完成的。把它移到那里,你应该没问题。

        值得注意的是,在这种情况下,使用 early return 习惯用法将有助于生成更易于阅读的代码,因为您无需继续“拖动”当前状态,只需在出现条件之一时快速失败坏了:

        public static boolean allLess(int[] a, int[] b) {
            if (a.length != b.length) {
                return false;
            }
            for (i = 0; i <= a.length - 1; i++) {
                if (a[i] >= b[i]) {
                    return false;
                }
            }
            return true;
        }
        

        【讨论】:

        • 谢谢。我的原始模式使用了“if”,然后使用了 for 循环,但我试图使用“布尔 Zen”来尽可能减少代码。
        【解决方案4】:

        您有一个检查来比较两个数组的长度,但您只在方法结束时对其进行操作。 Java 与任何其他语言一样,允许您在一个方法中包含多个返回语句,因此我的建议是在您执行检查后立即从该方法返回:

        if (a.length != b.length)
           return false;
        

        其次,代码中的digitDifference 语句只计算一次,数组中的第一个元素。我相信,您希望 for 循环对数组中的每个元素执行多次比较,但是,您将循环体留空。

        for (i = 0; i <= a.length - 1; i++) {
            if(a[i] >= b[i])
               return false;
        }
        

        同样,我的建议是一旦您发现其中一个元素违反了您的约束,就立即返回。并且只在 for 循环之后有一个return true;,这将表明所有元素都满足约束a[i] &gt;= b[i]

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-06
          • 2017-08-29
          • 1970-01-01
          • 1970-01-01
          • 2021-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多