【问题标题】:Comparing arrays that have same elements in different order比较具有不同顺序的相同元素的数组
【发布时间】:2011-12-27 13:34:35
【问题描述】:

我写了下面的代码来比较具有相同元素但顺序不同的数组。

 Integer arr1[] = {1,4,6,7,2};
 Integer arr2[] = {1,2,7,4,6};

例如,上面的数组相等,因为它们相同的元素 1,2,4,6,7。如果您对更大的数组有更好的代码,请分享。

编辑 如果从两个数组中获取唯一元素并且它们看起来相同,那么数组也应该相等。如何在不使用任何集合类的情况下编写代码。 例如:arr1={1,2,3,1,2,3} arr2={3,2,1} 方法应返回 true(=两个数组相同)。

package com.test;

public class ArrayCompare {

public boolean compareArrays(Integer[] arr1, Integer[] arr2){
    if(arr1==null || arr2==null){
        return false;
    }
    if(arr1.length!=arr2.length){
        return false;
    }

    Integer[] sortedArr1=sortArray(arr1);
    Integer[] sortedArr2=sortArray(arr2);

    for(int i=0;i<sortedArr1.length-1;i++){
        if(sortedArr1[i]!=sortedArr2[i]){
            return false;
        }
    }
     return true;
}
public void swapElements(Integer[] arr,int pos){
    int temp=arr[pos];
    arr[pos]=arr[pos+1];
    arr[pos+1]=temp;
}
public Integer[] sortArray(Integer[] arr){
    for(int k=0;k<arr.length;k++){
        for(int i=0;i<arr.length-1;i++){
            if(arr[i]>arr[i+1]){
                swapElements(arr,i);
            }
        }
    }
    return arr;
}


public static void main(String[] args) {
    Integer arr1[] = {1,4,6,7,2};
    Integer arr2[] = {1,2,7,4,6};
    ArrayCompare arrComp=new ArrayCompare();
    System.out.println(arrComp.compareArrays(arr1, arr2));
}

}

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    您关心重复计数吗?例如,您是否需要区分{ 1, 1, 2 }{ 1, 2, 2 }?如果没有,只需使用HashSet

    public static boolean compareArrays(Integer[] arr1, Integer[] arr2) {
        HashSet<Integer> set1 = new HashSet<Integer>(Arrays.asList(arr1));
        HashSet<Integer> set2 = new HashSet<Integer>(Arrays.asList(arr2));
        return set1.equals(set2);
    }
    

    如果您确实关心重复,那么您可以使用Guava 中的Multiset

    如果你想坚持排序版本,为什么不使用内置的排序算法而不是自己编写?

    编辑:如果您愿意修改现有数组,您甚至不需要创建副本。例如:

    public static boolean compareArrays(Integer[] arr1, Integer[] arr2) {
        Arrays.sort(arr1);
        Arrays.sort(arr2);
        return Arrays.equals(arr1, arr2);
    }
    

    您还可以针对数组长度不同的情况进行优化:

    public static boolean compareArrays(Integer[] arr1, Integer[] arr2) {
        // TODO: Null validation...
        if (arr1.length != arr2.length) {
            return false;
        }
        Arrays.sort(arr1);
        Arrays.sort(arr2);
        return Arrays.equals(arr1, arr2);
    }
    

    【讨论】:

    • 谢谢。我将使用内置的排序算法。
    • @abhishek:查看我的编辑 - 无需按照 Itay 的回答构建列表,尽管显然这也可以。
    • 除非有非常迫切的需要,否则重新发明轮子并不是一个好主意。您可以使用 java 集合来完成这项工作,因为它们被编写以提供更好的效率。如果你确信,那么我相信你应该再看看@Jon Skeet 的建议。
    • 正是我想要的。
    【解决方案2】:

    如果你没有重复,你可以把数组变成集合:

    new HashSet<Integer>(Arrays.asList(arr1))
        .equals(new HashSet<Integer>(Arrays.asList(arr2)))
    

    否则:

    List<Integer> l1 = new ArrayList<Integer>(Arrays.asList(arr1));
    List<Integer> l2 = new ArrayList<Integer>(Arrays.asList(arr1));
    
    Collections.sort(l1);
    Collections.sort(l2);
    
    l1.equals(l2);
    

    【讨论】:

    • 感谢您的回答。抱歉之前没有提过,但不想使用收藏。
    • @abhishek:为什么不呢?如果您要施加任意限制,则应说明您的动机,因为这很可能会影响其他建议。
    • @JonSkeet Skeet 如果我可以使用内置库/集合,我认为为这个问题编写解决方案是直截了当的。我只是想学习解决问题的技巧。谢谢
    • @abhishek:解决问题的很大一部分是使用您可用的工具。如果你想学习排序算法,那是一回事——但这与比较相等性是分开的。
    【解决方案3】:

    如果您知道值的间隔,则可以保存一个大小等于序列最大元素的整数数组。然后遍历每个数组,将counter数组中的值对应的位置的数字加1。最后遍历counter数组,判断是否所有不为0的元素都是2,此时数组相等。

    int[] counters = new int[MAX];
    for(int i = 0; i < length1; i++)
        counters[array1[i]]++;
    for(int i = 0; i < length2; i++)
        counters[array2[i]]++;
    
    bool areEqual = true;
    for(int i = 0; i < MAX; i++)
        if(counters[i] != 0 && counters[i] != 2) 
        {
            areEqual = false;
            break;
        }
    

    这假设没有重复。如果你有重复,那么在前两个 for 循环中添加:

    for(int i = 0; i < length1; i++)
        if(counters[array1[i]] == 0)
           counters[array1[i]]++;
    

    这样可以确保在第一个之后不考虑任何重复。

    【讨论】:

    • 这是我正在寻找的东西。谢谢
    【解决方案4】:

    您正在重新发明轮子以对数组进行排序

    使用

    java.util.Arrays.sort(T[] a, Comparator<? super T> c)
    

    还有一些方法可以对原始类型进行排序,例如 int。

    【讨论】:

      【解决方案5】:

      试试这个函数它返回数组:-

      public static String[] numSame (String[] list1, String[] list2) 
           {  
                int same = 0;  
                for (int i = 0; i <= list1.length-1; i++) 
                {  
                   for(int j = 0; j <= list2.length-1; j++) 
                   {  
                      if (list1[i].equals(list2[j])) 
                      {  
                          same++;  
                          break;  
                      }  
                   }  
                }  
      
                String [] array=new String[same];
                int p=0;
                for (int i = 0; i <= list1.length-1; i++) 
                {  
                   for(int j = 0; j <= list2.length-1; j++) 
                   {  
                      if (list1[i].equals(list2[j])) 
                      {  
                          array[p]=  list1[i]+"";
                          System.out.println("array[p] => "+array[p]);
                          p++;
                          break;  
                      }  
                   }  
                } 
                return array;
             }  
      

      【讨论】:

        【解决方案6】:
        private static boolean compairArraysOfDifferentSequence(Integer[] arr1, Integer[] arr2){
        
            if(arr1 == null || arr2 == null){
        
                return false;
            }
            if(arr1.length != arr2.length)
            {
                return false;
            }
            else{
        
                Arrays.sort(arr1);
                Arrays.sort(arr2);
        
                return Arrays.deepEquals(arr1, arr2);
            }
        
        }
        

        【讨论】:

        • 你真的应该从if (arr1 == arr2) return true; 开始,因为Arrays.equals() 这样做可以避免很多工作。
        猜你喜欢
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        相关资源
        最近更新 更多