crazyTechie
crazyTechie

Reputation: 2557

Comparing arrays that have same elements in different order

I wrote below code to compare to arrays that have same elements but in diff order.

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

For example, Above arrays are equal as they same elements 1,2,4,6,7. If you have better code for larger arrays, please share.

Edit If unique elements are taken from both the arrays and if they appear to be same, then also array should be equal. How do I write the code without using any collections classes. Ex: arr1={1,2,3,1,2,3} arr2={3,2,1} Method should return true (=both arrays are same).

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

}

Upvotes: 11

Views: 50088

Answers (6)

pooja
pooja

Reputation: 11

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

}

Upvotes: 0

duggu
duggu

Reputation: 38439

Try this function it return array:-

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

Upvotes: 0

Tudor
Tudor

Reputation: 62469

If you know the interval of values, you could hold an integer array with the size equal to the maximum element of the sequences. Then traverse each array and increment by 1 the number at the position corresponding to the value in the counter array. At the end, traverse the counter array and determine if all elements that are not 0 are 2. In this case the arrays are equal.

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

This assumes there are no duplicates. If you have duplicates, then in the first two for loops add:

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

This ensures that any duplicates are not considered after the first one.

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1503859

Do you care about duplicate counts? For example, would you need to distinguish between { 1, 1, 2 } and { 1, 2, 2 }? If not, just use a 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);
}

If you do care about duplicates, then either you could use a Multiset from Guava.

If you want to stick with the sorting version, why not use the built-in sorting algorithms instead of writing your own?

EDIT: You don't even need to create a copy, if you're happy modifying the existing arrays. For example:

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

You can also have an optimization for the case where the arrays aren't the same length:

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

Upvotes: 24

viktor
viktor

Reputation: 1297

You are reinventing wheel to sort arrays.

Use

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

also there are methods to sort primitive types such as int.

Upvotes: 0

Itay Maman
Itay Maman

Reputation: 30733

If you have no duplicates you can turn the arrays into sets:

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

Otherwise:

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

Upvotes: 4

Related Questions