2011-11-12 76 views
7

我寫下面的代碼來比較具有相同元素但不同順序的數組。比較具有不同順序的相同元素的數組

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)); 
} 

}

回答

20

你關心的重複計數?例如,您是否需要區分{ 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); 
} 
+0

感謝。我將使用內置的排序算法。 – crazyTechie

+0

@abhishek:看看我的編輯 - 根據Itay的回答,沒有必要建立列表,但顯然這也可以。 –

+0

除非有非常迫切的需求,否則重新發明車輪並不是一個好主意。您可以使用Java集合來完成作業,因爲它們的寫作效率更高。如果你確信,那麼我相信你應該再次看看@Jon Skeet提出的建議。 – Drona

4

如果您有沒有重複,你可以把陣列成組:

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); 
+0

感謝您的回答。對不起,以前不提,但不想使用集合。 – crazyTechie

+0

@abhishek:爲什麼不呢?如果你要施加任意的限制,你應該解釋你的動機,因爲它可能會影響其他建議。 –

+0

@JonSkeet Skeet如果我可以使用內置的庫/集合,我認爲寫這個問題的解決方案很簡單。我只是想學習解決問題的技巧。謝謝 – crazyTechie

0

您正在爲重新發明輪子來排列陣列

使用

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

也有方法,以原始的類型,如int排序。

1

如果知道值的間隔,可以保存一個整數數組,其大小等於序列的最大元素。然後遍歷每個數組,並在與計數器數組中的值相對應的位置增加1。最後,遍歷計數器數組,並確定是否所有不是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]]++; 

這確保了任何重複不是第一個之後,就認爲。

+0

這是我正在尋找的東西。謝謝 –

0

試試這個功能,它返回數組: -

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; 
     } 
0
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); 
    } 

} 
+0

你應該真正開始使用'if(arr1 == arr2)return true;'作爲'Arrays.equals()'來做,它可以避免很多工作。 –

相關問題