2010-02-02 15 views
1

저는 다차원 배열 (정렬되지 않음)에서 중복 요소의 모든 인덱스를 찾아내는 함수를 만드는 데 어려움을 겪었습니다.이 경우에는 5x5 배열을 사용하고, 발견 된 인덱스를 사용하여 점수 배열의 평행 요소 그러나 배열 내에서 다른 열과 비교하지 않고 열 내에서만 중복을 찾습니다. 지금까지 온라인에서 수행 한 연구가 있습니다. 이 코드의 주요 문제점은 모든 중복 요소를 찾을 수 있지만 원본은 찾지 못한다는 것입니다. 예 : 배열에 요소 : {{ "a", "a", "a"}, { "b", "b", "b"}, { "a", "c" a "}}이면 병렬 스코어 배열을 {{0,1,0}, {1,1,1}, {0,1,0}}으로 변경해야합니다. 하지만 대신 마지막 행과 맨 위 행의 중복을 인식합니다.중복 배열 요소 찾기

코드 :

public static void findDuplicates(String a[][]) 
{ 
    System.out.println("*Duplicates*"); 
    Set set = new HashSet(); 
    for(int j = 0; j<a.length; j++) 
    { 
     for(int i=0; i < a[0].length; i++) 
     { 
      if(!set.contains(a[i][j])) 
      { 
       set.add(a[i][j]); 
      } 
      else 
      { 
       System.out.println("Duplicate string found at index " + i + "," + j); 
       scores[i][j] -= scores[i][j]; 
      } 

     } 
     set = new HashSet(); 
    } 
} 

내 설명이 조금 복잡 알고 있지만, 잘하면 충분히 이해할 수있다. 감사합니다. Jake.

답변

3

논리가 올바르지 않습니다. 귀하의 외부 루프는 j이며, 내부 루프는 i하지만 당신은 일을하는지 :

set.add(a[j][i]); 

기술적으로는 배열이 경우 경계 부족 예외를 얻을 수 :

set.add(a[i][j]); 

그것은 다른 방법으로 주위해야한다 NxN이 아닙니다. 그러나 당신은 그것을 전제 조건으로 말할 수 있습니다. 열 내에서 중복을 찾기 위해

scores[i][j] = 0; 

:하지만 왜 그냥

scores[i][j] -= scores[i][j]; 

:

public static void findDuplicates(String a[][]) { 
    for (int col=0; col<a[0].length; col++) { 
    Map<String, Integer> values = new HashMap<String, Integer>(); 
    for (int row=0; row<a.length; row++) { 
     Integer current = values.put(a[row][col], row); 
     if (current != null) { 
     scores[row][col] = 0; 
     scores[current][col] = 0; 
     } 
    } 
    } 
} 

이 어떻게 당신은 또한으로 0으로 설정하는 몇 가지 이유를 들어

이 일?

  • 루프 변수의 이름을 rowcol으로 변경했습니다. rowcol이 더 자세한 설명이 필요한 경우 ij을 사용할 이유가 없습니다.
  • 입력 배열이 전제 조건으로 올바른 것으로 가정합니다. 그러나 NxM이 될 수 있습니다 (NxN이 아닌).
  • Map을 사용하여 각 값의 색인을 저장합니다. 키가 이미 Map에있는 경우 Map.put()은 이전 값을 반환합니다. 그럴 경우 중복 된 것을 발견했습니다.
  • 현재 (행, 열) 및 (현재 열)은 0으로 설정됩니다. 단순히 0으로 설정하기보다는 자체에서 점수를 빼는 이유는 무엇입니까?
  • 값 "a"가 열에서 3 번 이상 발견되면 scores[current][col]은 두 번 이상 0으로 설정됩니다.이 값은 불필요하지만 유해하지 않으므로 더 간단한 코드가됩니다.
  • 제네릭을 사용하여 Map을 선언했습니다. 이것은 유용하고 권장됩니다.Map에는 String 개의 키와 Integer 값이있어 전송을 절약 할 수 있습니다.
  • 또한 자동 상자 열기 및 자동 언 박싱을 사용하여 int (루프 변수)을 래퍼 클래스 Integer으로 변환하거나 변환합니다.