【问题标题】:Comparing each element in of two arrays比较两个数组中的每个元素
【发布时间】:2015-10-17 22:03:39
【问题描述】:

这是我的问题:

编写一个名为allLess 的方法,该方法接受两个整数数组,如果第一个数组中的每个元素都小于第二个数组中相同索引处的元素,则返回true。如果数组长度不同,您的方法应该返回 false。

这是我的测试数据:

int[] arr1 = {1,2,4}; 
int[] arr2 = {3}; 
int[] arr3 = {5,4,6}; 
int[] arr4 = {2,2,7}; 
int[] arr5 = {2,3,6,8}; 

System.out.println(allLess(arr1,arr2)); //should print false 
System.out.println(allLess(arr1,arr3)); //should print true 
System.out.println(allLess(arr1,arr4)); //should print false 

这是我目前的代码:

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

但是,当我尝试System.out.println(allLess(arr1,arr4)); 时,它打印的是真的。我该如何解决这个问题?

【问题讨论】:

    标签: java arrays for-loop


    【解决方案1】:

    关键:您应该扫描直到发现不匹配。您目前只在寻找第一个满意的案例。

    你需要改变的主要部分是你的条件 - 翻转它的条件。

    if(a[i] >= b[i]) {
        return false;
    }
    

    请务必将您的最后一次返回更改为 true,因为您已经用尽了所有负面条件,并且您可以继续前进了。

    这里应该做更多的清理工作,因为我们正在研究它。

    首先,在任何地方都使用大括号。这样做,您的代码会更容易理解。如果您突然发现需要在没有大括号的条件块中添加更多内容,您也不会遇到错误。

    接下来,您不需要为数组的长度声明更多变量 - 您只需在两个地方关心它们。只需直接引用a.lengthb.length,因为它不是方法调用;它是一个字段,无需任何费用即可访问。

    第三,您的else if 条件是多余的;它应该是else。数组的长度要么相等,要么不相等。

    这可能是整体的样子:

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

    存在对这种基本形式的简化。


    如果您对以 Java 8 为中心的方法感兴趣,那么您可以考虑使用流的这种方法。本质上,我们要扫描所有元素,如果数组的长度不相等且 ai 中的值不等于 bi,则拒绝整个语句子>.

    public static boolean allLess(int[] a, int[] b) {
        return a.length == b.length && IntStream.range(0, a.length)
                                                .allMatch(i -> a[i] < b[i]);
    }
    

    【讨论】:

    • +1 对于有经验的开发人员,我个人不一定同意“在任何地方都使用大括号”的说法(这就是缩进的用途),但对于初学者来说,这是一个好主意。然而,编码风格是一场永无止境的辩论。这是开始一个新项目时引起大多数争论的原因。
    • @LINEMAN78:省了这么多心痛,不能永远依赖缩进。
    【解决方案2】:

    if语句提前返回,需要反转逻辑返回:

                if(a[i]>=b[i])
                    return false;
    

    【讨论】:

    • 我需要将最后一个返回值更改为 true,对吧?
    【解决方案3】:

    此代码仅比较数组的前两个元素。您可以尝试以下方法:

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

    【讨论】:

    • if 上的 else 声明是不必要的。优化器应该删除它,但我从不指望它。
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2021-05-06
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多