【问题标题】:A loop to compare all string values of an array比较数组的所有字符串值的循环
【发布时间】:2016-05-25 19:36:50
【问题描述】:

假设您有一个字符串数组 arr,其中包含 3 个字符串。要比较它的值,您只需执行以下操作:

if (arr[0].equals(arr[1]) && arr[0].equals(arr[2] && arr[1].equals(arr[2]) {
    return true;
}

但是如果这个数组有数百个字符串呢?比较所有值的最佳方法是什么?

我曾想过使用 for 循环,但 Java 不允许在条件中使用循环。有什么想法吗?

【问题讨论】:

  • 但它确实允许循环内的条件......
  • 另外,不需要您的第三次检查。如果 a == b AND a == c,那么由于transitivity,我们已经知道 b == c。检查每个元素是否等于第一个就足够了。
  • 更好的方法是不要在数据结构中放置重复的字符串。这意味着您应该考虑使用哈希表或类似的东西。以 O(1) 的效率结束。
  • 您使用的是什么版本的 Java?
  • @azurefrog 我试图将循环放在条件中,而不是在循环中放置条件。例如,if(for 循环){}

标签: java arrays loops


【解决方案1】:
for(int i = 0; i < arr.length-1; i++){
    if(!arr[i].equals(arr[i+1])){
        return false;
    }
}
return true;

【讨论】:

    【解决方案2】:

    执行此操作的蛮力方法是将第一个字符串与数组中的所有其他字符串进行比较。

    public boolean allUnique(String[] arr){
        //Assuming the array has at least 1 element. 
        String s = arr[0];
        for(int i = 1; i < arr.length; i++){
            if(!arr[i].equals(s)){
                return false;
            }   
        }
        return true;
    }
    

    【讨论】:

    • 这种方法是我的尝试之一,但实际上我需要该方法在检查所有值后返回true而不是false。
    • @LawrenceLelo 您可以在循环后返回 true。如果所有比较都匹配,那么它将返回 true。
    【解决方案3】:

    这个 1-liner 怎么样:

    return Arrays.stream(arr).distinct().count() == 1;
    

    这段代码巧妙地处理空(但不是空)数组,如果为空则返回false

    如果要在数组为空时返回true,请将测试改为:

    return Arrays.stream(arr).distinct().count() < 2;
    

    【讨论】:

    • 在二维数组的情况下,假设您打算仅比较第二行的值作为示例。
    • 将'返回 Arrays.stream(arr[1]).distinct().count() == 1;'工作?还是没有?
    • 不。我刚刚用一维数组对此进行了测试并且工作正常。但它不适用于二维数组。
    • 你把'arr'改成'arr[1]'了吗?
    • 我有。结果是 return Arrays.stream(arr[1]).distinct().count() == 1;
    【解决方案4】:

    如果数组可以是任意维度,那么Objects.deepEquals() method 可能会有所帮助:

    boolean allEqual = Arrays.stream(arr).allMatch(a -> Objects.deepEquals(arr[0], a));
    

    更好:

    boolean allEqual = Arrays.stream(arr, 1, arr.length) // bounds check left
        .allMatch(a -> Objects.deepEquals(arr[0], a));   // to the reader :)
    

    测试:

    String[][] arr = {
        {"a", "a"},
        {"a", "a"},
        {"a", "a"}};
    
    boolean allEqual = Arrays.stream(arr, 1, arr.length)
            .allMatch(a -> Objects.deepEquals(arr[0], a));
    
    System.out.println(allEqual); // true
    

    【讨论】:

    • 我刚刚用二维数组测试了这段代码。它编译但它返回 false。
    • @LawrenceLelo 你的支票是什么?它返回true 给我一个二维数组。
    • 我用对象数组而不是字符串来测试代码。但是,这些对象确实使用 toString() 方法返回了一个字符串。也许我的结果不同,因为我使用的是对象数组而不是字符串。
    • @LawrenceLelo 如果您使用对象,请确保它们始终如一地实现 equals()。
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多