2013-11-26 5 views
2

나는 정수 배열의 arraylist 있고 첫 번째 배열에서 각 배열을 통해 가서 arraylist있는 모든 이전 배열을 비교할 싶어요. 배열이 이전 배열 중 하나와 같으면 프로그램은 "반복"을 출력하고 프로그램을 중지해야합니다. 또한, 프로그램을 더 빠르고 효율적으로 실행할 수 있도록 배열을 정렬하는 방법이 있습니까? 미리 감사드립니다.정수 배열 Arraylist Java에서 정렬 및 비교

Arraylist<int[]> numbers = new Arraylist<int[]>(); 

    int[] num1 = new int[]{1,2,3}; 
    int[] num2 = new int[]{2,3,5}; 
    int[] num3 = new int[]{1,2,3}; 
    int[] num4 = new int[]{3,2,6}; 

numbers.add(num1); 
numbers.add(num2); 
numbers.add(num3); 
numbers.add(num4); 

(Sorting to make more efficient and faster) 

(Comparing) 

이 프로그램은 "반복"그들이 동일하기 때문에이 NUM1에 num3을 비교 한 후 중지 인쇄한다.

답변

2

배열을 hashCode()equals()을 구현하는 작은 래퍼에 넣으십시오. 그런 다음 add() 방법을 사용하여 HashSet에 넣으십시오. add 메서드가 false을 반환하면 중복 된 것입니다.

hashCode()Arrays.equals(array1, array2)의 반환 값에 Arrays.hashCode을 사용하여 equals()을 구현할 수 있습니다.

나중에 목록을 만들려면 Set에서 개체를 검색하고 바이트 배열을 가져 와서 목록에 넣어야합니다. List.addAll()을 사용하여 랩퍼 오브젝트를 목록에 넣을 수 있습니다. 하지만 어쩌면 당신은 Set을 계속 사용하기를 원합니다.


OK, 그래서 어쩌면 내가 당신을 위해 구현을했습니다, 약간 고급의 :

public class Dupes { 

    public static class WrappedArray { 
     public WrappedArray(int[] wrapped) { 
      this.wrapped = wrapped; 
     } 

     public int[] getWrapped() { 
      return this.wrapped; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (!(obj instanceof WrappedArray)) { 
       return false; 
      } 
      WrappedArray that = (WrappedArray) obj; 
      return Arrays.equals(this.wrapped, that.wrapped); 
     } 

     @Override 
     public int hashCode() { 
      return Arrays.hashCode(wrapped); 
     } 

     private final int[] wrapped; 
    } 

    public static void main(String[] args) { 
     List<int[]> numbers = new ArrayList<int[]>(); 

     int[] num1 = new int[] { 1, 2, 3 }; 
     int[] num2 = new int[] { 2, 3, 5 }; 
     int[] num3 = new int[] { 1, 2, 3 }; 
     int[] num4 = new int[] { 3, 2, 6 }; 

     numbers.add(num1); 
     numbers.add(num2); 
     numbers.add(num3); 
     numbers.add(num4); 

     Set<WrappedArray> wrappedNumberSet = new HashSet<>(); 

     int index = 1; 
     for (int[] number : numbers) { 
      if (!wrappedNumberSet.add(new WrappedArray(number))) { 
       System.out.println("Duplicate num" + index); 
      } 
      index++; 
     } 
    } 
} 
+0

미안 해요. Java를 처음 사용하니 hashCode()가 무엇입니까? 어떻게 사용합니까? – user2654764

+1

Hashcode는 모든 데이터 객체에 대해 * 대개 * 다른 값을 반환합니다. 'HashSet'은 이것을 사용하여 값을 찾은 다음 'equals'를 수행하여 값이 동일한 지 확인합니다. –

+0

HashSet이란 무엇입니까? – user2654764

1

정렬 정렬과 내부 배열 같은 퀵한다.

Arrays.equals (num1, num3);을 수행하여 배열을 비교할 수 있습니다. 배열이 정렬 된 경우에만 작동합니다. 두 배열은 같은 수의 요소를 포함하고, 두 배열의 대응하는 요소 페어가 모두 동일한 경우

자바 문서에서

는 "두 배열이 동일한 것으로 간주됩니다. 즉, 두 배열은 경우 동일 동일한 순서로 같은 요소가 포함되어 있습니다. "

+0

정말입니까? 나는 당신이'Arrays.equals()'를 필요로한다고 생각한다. Java [I.equals()는 Object로부터 직접 상속 받았다. 즉, 참조를 비교한다. –

+0

정확합니다. 편집 된 솔루션. –