2014-02-20 3 views
2

중복이 있는지 여부에 따라 열과 행의 중복을 검사하고 true 또는 false를 반환하는 방법은 무엇입니까? 예를 들어행과 열의 중복 확인 2D Array

1 2 3

3 1 2

2 3 1

는 true를 돌려 때문에 더 중복,하지만 ..

1 2 2

3 2 3

2 1 1

열 2 {2, 2, 1}에 중복이 있으므로 false를 반환합니다.

행에 중복 된 항목이 있는지 확인한 다음 열에 중복 된 항목이 있는지 확인하는 방법은 무엇입니까?

public static boolean hasDuplicates(int [][] inArray) 
{ 
    for (int row = 0; row < inArray.length; row++) 
    { 
     int rowCheck = inArray[row][inArray.length]; 
     for (int col = 0; col < inArray[row].length; col++) 
     { 

     } 
    } 
    return false; 
} 

그래서 나는 열 또는 행 사이에 어떤 중복이있는 경우 배열에 받아 확인해야합니다

지금까지 나는 다음과 같은 경우에만 있습니다. 어떤 포인터? 고맙습니다!

참고 :이는 외부 방법 행에 대한

+3

첫 번째 예에서 3-2-3이 "중복"되지 않는 이유는 무엇입니까? 당신이 묻고있는 것이 조금 분명하지 않습니다. –

+0

@BrianRoach 내 사과! 세 번째 행은 2-3-1, 편집해야합니다! – user3335070

+0

다음과 같은 질문에서 답을 찾을 수 있습니다. http://stackoverflow.com/questions/6122315/java-how-to-find-duplicate-values-in-rows-and-columns-in-a- 2d- 배열 – Tim

답변

1

행의 각 값을 살펴 봅니다. 모든 값에 대해 해당 값 다음의 값이 동일한 지 확인하고 확인하십시오. 값이 같으면 true를 반환합니다 (중복을 찾았습니다). 값이 같지 않으면 색인을 증가시키고 다음 행에 대해 동일한 작업을 수행하십시오. 모든 행은 n (n + 1)/2 개의 비교를 거치지 만 훌륭하지는 않습니다. 따라서 n이 열의 수이고 행의 수인 경우 최악의 경우 m (n (n + 1)/2) 회 실행됩니다. 뿐만 아니라 열을 어떻게 확장 할 아주 쉬운 것입니다

/** 
* Return flag indicating if there are duplicates in the rows of the 2D array 
* 
* @return true if a row has duplicates, else false 
*/ 
public boolean hasDuplicatesInRows(int[][] inArray) 
{ 
    for (int row = 0; row < inArray.length; row++) 
    { 
     for (int col = 0; col < inArray[row].length; col++) 
     { 
      int num = inArray[row][col]; 
      for (int otherCol = col + 1; otherCol < inArray.length; otherCol++) 
      { 
       if (num == inArray[row][otherCol]) 
       { 
        return true; 
       } 
      } 
     } 
    } 

    return false; 
} 

: 여기

은 행 작동하는 방법의 예입니다. 나는 너를 위해 그것을 남겨 둘 것이다.

효율적인 정렬 방법을 사용하고 모든 행을 정렬 한 경우 해당 행 아래로 내려 가서 값이 그 값과 동일한 지 확인하십시오. 맞으면 true를 반환하고 그렇지 않으면 false를 반환합니다. 대용량 데이터 세트를 사용하는 것이 더 효율적입니다.

+0

죄송합니다. 위에서 언급 했어야 만 외부 방법을 사용할 수 없습니다. 도움을 주셔서 감사합니다.이 길로 갈 수 있으면 좋겠어요. – user3335070

+0

질문을 편집하여 그 내용을 – mdewitt

+0

에 추가해야합니다. 당신은없이 이것을하기를위한 어떤 포인터가 있습니까. 나는 그것을 달성하는 방법을 모르겠 개념을 이해 – user3335070

1

수행 할 수 없습니다, 절차 이런 종류의 다음과 같은 시도 : 다음에서 검색, 그래서

boolean dup = false; 
for (int k = 0; k < inArray[0].length){ //loop through columns 
    for (i = 0; i < inArray.length-1; i++) { 
    for (int j = i; j < inArray.length; j++){ 
     if (inArray[k][i] == inArray[k][j]){ 
     dup = true; 
     break; 
     } 
    } 
    } 
} 

, 당신은 첫 번째 요소에서 시작하고 요소 2를 n (즉, 열 수). 일치하는 항목이 발견되면 부울을 true로 설정합니다. 일치하지 않으면 i가 증가하고 inner for 루프가 요소 3에서 n으로 스캔합니다.

열에 대해서도 비슷한 절차를 따르십시오.

+0

그래서'for (i = 0; i user3335070

+0

예. 나는 원래 "n"을 가지고 있었기 때문에 나는 그 대답을 좀 더 일반화하기 시작했다. 나는 그것을 내 대답에 던질 것이다. –

1

일차원 배열에서 작동하는 메서드를 만드는다고 가정 해 보겠습니다.문제를 2 차원 배열에서 1 차원 배열로 추출합니다. 서명은 boolean containsDupes(int[] strip) { ... }처럼 보일 것입니다.

이 방법에는 해결하기 쉬운 두 가지 방법이 있습니다. 하나는 배열을 정렬하여 나머지가 서로 옆에 있도록하는 것입니다. 또 다른 방법은 HashSet을 각 값으로 채우고 Set의 크기를 배열의 길이와 비교하는 것입니다.

1

이 작업을 수행하는보다 간단한 방법은 모든 값을 집합에 추가 한 다음 집합의 고유 한 요소 수를 구아바를 사용하여 원래 행 크기와 비교하는 것입니다.

public static boolean hasDuplicates(int [][] inArray) { 
    for (int row = 0; row < inArray.length; row++) { 
     int curRow = inArray[row]; 
     Set set = Sets.newHashSet(Arrays.asList(curRow)); 
     if (set.size() < curRow.length) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

이것은 세트 나리스트를 사용할 수없는 프로그램을위한 것입니다. 미안하지만, 내가 위에서 언급 했어야했다. – user3335070