2013-04-23 5 views
0

나는 이진 검색 방법을 사용하여 특정 키를 사용하여 첫 번째 요소와 마지막 요소를 찾아야합니다. searchFirst 메서드를 사용하여 이미 완료되었지만 searchLast 메서드를 완료 할 수 없습니다. 가끔은 때로는 작동하지 않습니다 (그것은 가치있는 메신저에 달려 있습니다) 그리고 그게 문제입니다.특정 키를 사용하여 배열의 마지막 요소를 찾는 방법

저는 타임 스탬프, 이름, 제품 등 텍스트 파일을 읽는 것과 같은 몇 가지 속성을 가진 Data 클래스가 있습니다. 메신저 때 병합 정렬로 배열을 정렬 데이터 배열을 작성 완료되었습니다.

그런 다음 특정 이름으로 배열의 첫 번째 요소와 마지막 요소가 필요합니다.

searchFirst 메소드는 완벽하게 작동하지만 searchLast는 내가 원하는 것을 수행하지 않습니다.

다음은 searchLast 메소드의 코드입니다 (n은 검색해야하는 값이고 w는 현재 사용되지 않음).

public static int searchLast(Data[] array, String n, String w) { 
     int left = 0; 
     int right = array.length - 1; 
     int m = -1; 

     while (left < right) { 
      m = (left + right)/2; 
      if (array[m].getName().compareTo(n) > 0) { 
       right = m - 1; 
      } else { 
       left = m + 1; 
      } 
     } 

     if (m >= 0) { 
      if (array[right].getName().equals(n)) { 
       return right; 
      } 
     } 

     return NO_KEY; 
    } 

어쩌면 당신이 ...

+0

당신이 우리의 예를 줄 수없는 경우에 코드가 마지막 가끔 발견 ... 나를 도울 수있는 버그를 찾을 수 없습니다 입력이 작동하지 않습니까? – Keppil

+0

내가 inputarray를 게시 할 수 있는지는 모르지만 getName은 "GXA : name"과 같은 String을 반환합니다. x는 숫자이고 예를 들어 "G13A : Shuffle"과 같은 String을 찾고 있습니다. 그게 충분한 정보인가? - 정수 배열의 특정 숫자로 마지막 요소를 찾는 것처럼 그것을 생각합니다. – XenonUnlimited

+0

'searchFirst'와'searchLast'는 저에게리스트에 하나 이상의 반복 된 값이 있다고 생각합니다. 이진 검색은이 경우를 처리하지 않습니다. 일단 발견하면 끝납니다. 이진 검색이어야합니까? –

답변

0
public static int searchLast(Data[] array, String n, String w) { 
     int left = 0; 
     int right = array.length - 1; 
     int m = -1; 
     int found = -1; 

      while (left < right) { 
       m = (left + right)/2; 
       if (array[m].getName().compareTo(n) > 0) { 
        right = m - 1; 
       } else if (array[m].getName().compareTo(n) < 0){ 
        left = m + 1; 
       } else { 
        found = m; 
        left = m + 1; 
      } 

     return found; 
    } 
+0

정말 고맙게 보이지만 작동하지 않습니다 ... 첫 번째 검색 값에 대해 15는 두 번째 예상 69에 대해서는 68이었고 세 번째 예상에 대해서는 68이었습니다. 85는 84였습니다. 귀하의 코드는 6 번 중 2 번 작동합니다 ... 실패 할 경우 -1로 실패합니다 – XenonUnlimited

+0

... 실수 (왼쪽의 <오른쪽)가 있어야합니다 (왼쪽의 <= 오른쪽) – XenonUnlimited

관련 문제