티스토리 뷰

발생일: 2009.06.09

문제:
전체 목록에서 특정 배열에 담겨있는 값을 찾아 표시하기 위해 Arrays.binarySearch를 사용하는 코드가 있다.
헌데, 정상적으로 값이 들어가 있음에도 불구하고 그 값을 찾지 못한다.

예)
아래와 같이 리스트와 배열이 있다.
    List<String> total : 전체 목록. 이 리스트 안의 값은 1부터 30까지 존재한다
    String[] spec : 특정 목록. 이 배열 안에는 (1, 5, 7, 25) 가 순서대로 들어있다.

for (String s : total) {
    if (Arrays.binarySearch(spec, s) > -1) }
        System.out.println(s); // spec 안에 있는 값일 경우 print
    }
}

위와 같은 코드를 실행시켰을 때, 1, 5, 7 까지만 인쇄되고 25는 인쇄되지 않는다.
문제가 뭘까?


해결책:
binarySearch는 이진검색으로,
정렬되어 있는 배열에서만 사용되며 순차 검색에 비해 그 속도가 빠르기 때문에 유용하다.
(자세한 내용은 Arrays 배열의 메서드에 대해 정리해놓은 블로그를 참고)

위 예제의 spec 배열은 1, 5, 7, 25 로 순서대로 정렬되어 있는 것 같지만 그렇지 않다.
String 배열이므로 실질적으론 그 값이 "1", "5", "7", "25" 이기 때문이다.
즉, 순서대로 정렬한다면 "1", "25", "5", "7" 이 되는 것이다.

실제 시스템에서 spec의 데이터는 DB에서 정렬된 값을 가져오는 것이었기 때문에,
여기서는 for 문의 앞에서 Arrays.sort(spec) 을 통해 한 번 정렬 후 수행하도록 적용해두었다.


반응형
댓글
공지사항