【问题标题】:Compare two arrays for any similar value [duplicate]比较两个数组的任何相似值[重复]
【发布时间】:2015-12-08 22:15:10
【问题描述】:

我想比较两个数组,如果在两个数组上都可以找到至少一个值。

场景#1:2在两个数组中都存在,所以结果是true

String[] x = {"1","2","3"};
String[] y = {"2","5","6"};

场景#2:没有匹配值,所以结果是false

String[] x = {"1","2","3"};
String[] y = {"4","5","6"};

Java 中是否有任何内置方法,或者任何库可以处理此要求?

我想强调的是,我正在寻找一个可以开箱即用的 Java 库或任何 Java 方法。

Collection.contains 不是一个选项,因为两个数组中的所有值都应该相同才能返回 true。 (如果两个数组中至少有一个值相似,我需要返回 true)

【问题讨论】:

  • 你的尝试是什么?

标签: java compare comparison


【解决方案1】:

您可以为此使用Collections#disjoint

如果两个指定的集合中没有元素,则返回 true 常见的。

...

请注意,允许在两个参数中传递相同的集合,在这种情况下,当且仅当集合为空时,该方法才会返回 true。

boolean isNoCommonElements = Collections.disjoint(
                                        Arrays.asList(x), Arrays.asList(y));

【讨论】:

    【解决方案2】:

    在 Java 8 中,您可以这样使用:

    String[] x = { "1", "2", "3" };
    String[] y = { "2", "5", "6" };
    
    Set<String> set = new HashSet<>(Arrays.asList(y));
    boolean result = Arrays.stream(x).anyMatch(set::contains); // true
    

    这是O(n)

    这是 @Markus 答案的 java 8 版本,尽管 anyMatch() 在找到匹配项时会停止迭代。

    注意:如果xy 的长度不同,请考虑使用更少的元素围绕数组创建流。这是因为HashSet.contains() 方法在O(1) 摊销时间内运行,与set 的长度无关,因此在最坏的情况下,迭代次数越少性能越好。

    【讨论】:

      【解决方案3】:

      没有内置方法,但您可以编写自己的实用方法,该方法将使用 Set 并查找匹配项。

      private boolean sharesAnElement(String[] a, String[] b) {
          Set<String> bSet = new HashSet<>(Arrays.asList(b));
      
          for (String str : a) {
              if (bSet.contains(str)) {
                  return true;
              }
          }
      
          return false;
      }
      

      【讨论】:

        【解决方案4】:

        这是一个相当具体的需求,我认为任何流行的收藏库都没有为此提供特殊功能。你可以这样做:

        Collection<String> set = new HashSet<String>(Arrays.asList(x));
        boolean result = false;
        for (String str: y) {
            result |= set.contains(str);
        }
        

        它具有 O(n) 复杂性,而不是遍历两个数组并逐个元素比较的 O(n^2)。

        【讨论】:

        • 错了,复制 x,你要在集合中复制 N 份 :)
        【解决方案5】:

        看来你在玩数组,所以我不打算在这里使用任何魔法类。只需使用纯数组,您就可以做到

        public boolean checkArrayEquals() {
            String[] x = { "1", "2", "3" };
            String[] y = { "2", "5", "6" };
            for (int i = 0; i < x.length; i++) {
                String xval = x[i];
                for (int j = 0; j < y.length; j++) {
                    if (xval.equals(y[j])) {
                        return true;
                    }
                }
            }
            return false;
         }
        

        【讨论】:

          【解决方案6】:

          这可能会有所帮助。改变打印语句返回true;如果你愿意。

          for (int i = 0; i < x.length; i++) {
              for (int j = 0; j < y.length; j++) {
                  if (x[i].equals(y[j])) {
                      System.out.println(x[i] + " is equal to " + y[j]);
                  }
              }
          }
          

          【讨论】:

            【解决方案7】:

            解决方案可以是您可以迭代 array1 值并使用每个元素在第二个数组中搜索。

            public static void compareArrays(String[] array1, String[] array2) {
                boolean b = false;
            
                for(String str1 : array1){
                    for(String str2 : array2){
                        if(str1 == str1){
                            b = true;
                            break;
                        }
                    }
                }
                System.out.println(b);
            }
            

            完整代码:

            public class HelloWorld{
            
                 public static void main(String []args){
                    String[] x = {"1","2","3"};
                    String[] y = {"3","5","6"};
                    compareArrays(x, y);
                 }
            
                 public static void compareArrays(String[] array1, String[] array2) {
                    boolean b = false;
            
                    for(String str1 : array1){
                        for(String str2 : array2){
                            if(str1 == str1){
                                b = true;
                                break;
                            }
                        }
                    }
                    System.out.println(b);
                }
            }
            

            【讨论】:

              【解决方案8】:

              您可以使用java.util.Set,例如HashSet为此:

              1. x 中的所有元素插入集合中
              2. 使用Set#contains(Object) 检查集合是否包含来自y 的任何元素

              http://docs.oracle.com/javase/8/docs/api/java/util/Set.html

              http://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html

              【讨论】:

                猜你喜欢
                • 2019-12-30
                • 1970-01-01
                • 1970-01-01
                • 2021-06-14
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-01-08
                • 1970-01-01
                相关资源
                最近更新 更多