2012-05-04 6 views
0

여러 개의 점 배열에서 고유 한 점을 찾고 싶습니다. 즉, 모든 중복 점을 제거하고 남은 점을보고 싶습니다.자바 - 여러 배열에서 중복 항목 찾기

int numCount = 0; 
    for (int x = 0; x < ALLARRAYS.length; x++) { 
     for (final Point test : ALLARRAYS[x]) { 
      NUMBER: for (final Point[] numbers : ALLARRAYS) { 
       if (numbers == ALLARRAYS[x]) { 
        continue; 
       } 
       for (int i = 0; i < numbers.length; i++) { 
        if (test.equals(numbers[i])) { 
         break NUMBER; 
        } else { 
         if (i == numbers.length - 1) { 
          numCount++; 
         } 
        } 
       } 
      } 
      if (numCount == 10) { 
       System.out.println(x + "\tPoint: " + test.x + ", " + test.y + " is unique."); 
      } 
      numCount = 0; 
     } 
     System.out.println(); 
    } 

는 기본적으로, 나는 검사 할 열한 배열이 때문에 10 개 배열에 대한 numCount 검사가 확인 될 : 여기

내가 시도 코드입니다. 내 접근 방식은 각 배열을 순환 한 다음 해당 배열의 모든 지점을 차례로 순환 한 다음 다른 모든 배열의 각 지점을 순환합니다. 중복 된 내용이 있으면 전체 번호를 건너 뜁니다.

내 문제 : 잘못된 읽기가 발생합니다. 무슨 일이 일어나고 있는지 모르겠지만 프로그램은 이미 다른 배열에있는 점을 뱉어냅니다.

내 목표 : 각 배열은 전체적으로 작동합니다. 하나의 요소가 충족되지 않으면 전체 배열을 건너 뜁니다. 내 최종 결과는 모두 11 개의 크기가 더 작은 배열이어야합니다.이 배열은 메서드가 각 집합의 요소를 검사하고 모두 고유하다는 것을 확인할 수 있도록 모두 고유합니다.

참고 : 배열은 모두 독특합니다. 엄청나게 거대합니다. 나는이 미니 프로그램을 만들어 중복을 없애 버리는 방법을 찾고있다.

내 질문 : 누군가 나를 도울 수 있습니까?

+1

질문은 무엇으로 시작? 이 코드는 예상대로 작동합니까? 아니면 문제가 있습니까? –

+0

음, 나는 잘못된 판독 값을 얻고 있습니다. 그것이 뱉어내는 포인트는 다른 배열에서 다른 시간에 발생합니다. – Confiqure

+2

몇 가지 샘플 입력, 실제 출력 및 예상 출력을 제공하여 문제의 원인을 파악하는 데 도움을 줄 수 있습니까? –

답변

1

코드는 배열하는 Point 당신이 나타납니다 찾고 포함, 문제의 Point에 대한 모든 배열을 확인하기 위해 나타납니다. 따라서 코드에서 항상 Point을 찾고 결과가 없습니다.

당신이 뭔가를 할 필요가 있습니다 :

 NUMBER: for (final Point[] numbers : ALLARRAYS) { 
      if (numbers == array) { 
       continue; // skip the array that contains 'test' 
      } 
      ... 
     } 

그런 식으로, 당신은 test 요소를 포함하는 배열을 건너 뜁니다.

+0

그럼 내가 뭘한다고 제안합니까? – Confiqure

+0

@ JavaCoder-1337 하나의 배열에서 무시하려는 중복 포인트가 없다면 Greg의 편집을 통해 편집해야합니다. –

+0

당신의 제안이 도움이되었지만, 아직도 나에게 몇 가지 중복을주었습니다. 현재 코드를 포함하여 원래 게시물을 편집했습니다. – Confiqure

2

모든 배열 항목을 집합에 넣으면 복제본을 건너 뜁니다.

Set 인터페이스의 구현에서 사용하므로 Point 클래스에서 equals 메서드를 올바르게 재정의하십시오.

HTH

+0

그가 새로운 배열에서 배열의 합집합을 원하면 작동 할 수 있습니다. –

+1

나는 이것을 찾고 있지 않습니다. 위의 예를 사용하십시오. – Confiqure

+0

더 나은 접근 방법은 _entry_에서 _number까지의 항목을 맵에 넣는 것이라고 생각합니다. 키는 'Integer'일 수도 있고 객체 할당이 걱정된다면 변경 가능한 'Integer' 타입 클래스 일 수도 있습니다. 맵을 생성하고 나면 맵 엔트리를 반복하고 카운트가 1 인 맵을 얻을 수 있습니다. – yshavit

0

어레이가 사용자의 작업에 적합하지 않습니다. 뿐만 아니라 교차 또는 removeAll과 같은 메소드가 없으며, 특히 크기를 줄이려면 변경하기가 어렵습니다.

이 번거 로움을 피하기 위해, 나는 하나 ...하지만 대칭의 이유로, 물론 충분하다 좌표 -1 x와 y를 설정하여 removed 같은 지점을 표시
import java.util.*; 
import java.awt.Point; 

public class RandPoints 
{ 
    Random r = new Random(); 
    Point [][] arr; 

    public void removeDuplicatesFrom2 (Point [] pa, Point [] pb) { 
     for (Point p : pb) { 
      if (p.x != - 1 && Arrays.asList (pa).contains (p)) { 
       // System.out.println ("dup: " + p.x + " " + p.y); 
       p.x = -1; 
       p.y = -1; 
      } 
     } 
    } 

    // create a random point in range (0..19)(0..19) 
    public Point randpoint() { 
     return new Point (r.nextInt (20), r.nextInt (20)); 
    } 

    // create 10 (default) arrays of size 100 (default) 
    public void init (int arrsize, int arrcount) 
    { 
     arr = new Point [arrcount][]; 
     for (int c = 0; c < arrcount; ++c) 
     { 
      Point [] points = new Point [arrsize]; 
      for (int s = 0; s < arrsize; ++s) 
      { 
       Point p = randpoint(); 
       points[s] = p; 
      } 
      arr[c] = points; 
     } 
    } 

    public void unify() 
    { 
     for (Point[] pac0 : arr) { 
      for (Point[] pac1 : arr) 
      { 
       if (pac0 != pac1) 
       removeDuplicatesFrom2 (pac0, pac1);  
      } 
     } 
    } 

    /** 
     fill arrays with duplicates by random, 
     show, delete and show again. 
    */ 
    public RandPoints (int arrsize, int arrcount) 
    { 
     init (arrsize, arrcount); 
     show(); 
     unify(); 
     System.out.println(); 
     show(); 
    } 

    public static void main (String args[]) 
    { 
     int arrsize = 100; 
     int arrcount = 10; 
     if (args.length == 2) 
     { 
      arrsize = Integer.parseInt (args[0]); 
      arrcount = Integer.parseInt (args[1]); 
     } 
     new RandPoints (arrsize, arrcount); 
    } 

    // visible feedback is always welcome while debugging/testing 
    public void show() 
    { 
     for (Point[] pa: arr) { 
      for (Point point: pa) 
       if (point.x != -1 && point.y != -1) 
        System.out.print (point.x + ", " + point.y + "\t"); 
      System.out.println(); 
     } 
    } 
} 

내가 수정 (20)에 대한 최대 범위를 구성 가능하도록 비트를 코드화하십시오.

java RandPoints 16 10 10 
3, 0 9, 0 6, 9 2, 3 6, 9 7, 4 9, 9 2, 5 8, 7 3, 3 9, 5 3, 7 0, 5 7, 6 0, 4 8, 1  
6, 1 2, 7 2, 5 6, 7 0, 7 5, 8 4, 2 1, 9 8, 4 5, 7 0, 2 3, 1 1, 9 2, 1 8, 0 1, 7  
5, 4 9, 7 9, 3 7, 3 1, 2 9, 6 0, 4 6, 0 3, 0 7, 7 1, 3 1, 1 5, 3 3, 8 1, 0 4, 9  
4, 7 8, 9 4, 0 0, 2 8, 7 5, 8 7, 0 1, 4 4, 9 8, 2 6, 9 9, 6 2, 1 1, 9 0, 8 6, 5  
6, 8 9, 6 1, 0 6, 9 4, 0 5, 1 2, 9 7, 3 5, 1 2, 5 6, 9 0, 9 7, 4 8, 1 5, 5 3, 4  
5, 9 0, 4 5, 4 2, 2 2, 6 7, 1 2, 0 6, 1 0, 4 9, 8 5, 7 5, 5 4, 6 9, 0 2, 8 8, 5  
8, 2 4, 2 0, 8 1, 1 0, 3 3, 4 1, 8 3, 1 6, 6 4, 1 3, 6 6, 0 1, 7 4, 8 1, 6 1, 1  
6, 2 1, 3 2, 4 0, 8 9, 0 3, 0 1, 1 3, 7 6, 2 2, 4 0, 9 3, 6 7, 2 1, 2 5, 0 8, 2  
2, 3 5, 6 7, 9 3, 0 9, 3 2, 6 4, 8 8, 7 9, 4 5, 3 0, 3 3, 0 5, 5 1, 4 6, 4 5, 2  
3, 2 4, 9 6, 9 4, 7 7, 1 0, 4 5, 8 7, 2 5, 2 5, 5 2, 1 9, 8 4, 9 6, 6 7, 7 0, 3  

3, 0 9, 0 6, 9 2, 3 6, 9 7, 4 9, 9 2, 5 8, 7 3, 3 9, 5 3, 7 0, 5 7, 6 0, 4 8, 1  
6, 1 2, 7 6, 7 0, 7 5, 8 4, 2 1, 9 8, 4 5, 7 0, 2 3, 1 1, 9 2, 1 8, 0 1, 7  
5, 4 9, 7 9, 3 7, 3 1, 2 9, 6 6, 0 7, 7 1, 3 1, 1 5, 3 3, 8 1, 0 4, 9  
4, 7 8, 9 4, 0 7, 0 1, 4 8, 2 0, 8 6, 5  
6, 8 5, 1 2, 9 5, 1 0, 9 5, 5 3, 4  
5, 9 2, 2 2, 6 7, 1 2, 0 9, 8 4, 6 2, 8 8, 5  
0, 3 1, 8 6, 6 4, 1 3, 6 4, 8 1, 6  
6, 2 2, 4 6, 2 2, 4 7, 2 5, 0  
5, 6 7, 9 9, 4 6, 4 5, 2  
3, 2