[백업][가리사니] 클래스 배열을 이진트리로 정렬/검색 하는 방법
java

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

대략 1000개이하의 데이터를 찾고싶을땐 HashMap을 사용하면되지만 데이터가 점점 많아지면 HashMap 보단 binarySearch [이진검색] 이 더 빠르게 작동하게 됩니다.

자바에서는 원시자료의 배열형태는 Arrays.binarySearch 그외 클래스들의 배열형태는 Collections.binarySearch 를 통해 이진검색 찾기가 가능합니다.

예를들어 아래와 같은 객체가 있습니다.

public class Member
{
	public int id;
	public String name;
	public String mobilePhone;
	public String homePhone;
	public String officePhone;
	public String fax;
	public String nick;
	public String homeAddr;
	public String homeZip;
	public String officeAddr;
	public String officeZip;
	public String email;
	public String memo;
	public String company;
	public String duty;
	public String homepage;
	public String birthday;
}

ArrayList<Member> list = new ArrayList<Member>();
// id를 기준으로 리스트를 찾는 소스를 만들고 싶을땐 Collections.binarySearch를 사용합니다.

하. 지. 만. 프로그램은 뭘 기준으로 찾아야할지 알수 없습니다. 그래서 아래와 같이 Comparable인터페이스를 사용하여 추가로 정렬할 수 있는 코드를 찾아줍니다.

public static class Member implements Comparable<Member>
{
	public int id;
	public String name;
	public String mobilePhone;
	public String homePhone;
	public String officePhone;
	public String fax;
	public String nick;
	public String homeAddr;
	public String homeZip;
	public String officeAddr;
	public String officeZip;
	public String email;
	public String memo;
	public String company;
	public String duty;
	public String homepage;
	public String birthday;

	@Override public int compareTo(Member another)
	{
		// 비교할 대상을 찾아줍니다.
		// 0이면 정확히 찾은것이며
		// - 이면 작은것 입니다.
		// + 이면 큰것 입니다.
		return this.id - another.id;
	}
}

앞서 설명을 깜박했지만 binarySearch를 쓰기전엔 먼저 정렬을 해야합니다.

Collections.sort(list);

그다음 이제 찾고싶은걸 찾으면됩니다.

ArrayList<Member> list = new ArrayList<Member>();
Collections.sort(list); // 최초 1회 정렬 [소스를 보시면아시겠지만 이진검색을 위해선 정렬이 필수입니다.]
...
Member node = new Member();
node.id = 1;
int rv = Collections.binarySearch(list, node);
// rv가 음수이면 없음.
// rv가 양수이면 해당 인덱스