2011년 12월 1일 목요일

Collections 정렬방법(아이폰, 안드로이드)

예전부터... 즉, API가 지금 같이 많이 준비되지 않은 도스 시절부터 프로그래밍을 해오던 터라.. 있는 것을 가져다 쓰기 보다는 만들어 쓰는 버릇이 생긴 것 같다.
일을 시작하고는 초반에...링크드 리스트(Objective-C에서 NSArray 등, Java에서 Vector 등..) 같은 것은 학교 다닐 때 배우건걸 이용해서 만들어 쓰기도 하고...했는데...
충격적인 것은 약 2년전.. 10년차가 될 때 까지 정렬 알고리즘을 써서 만들어 정렬했다는 것...

좀 하시는 분들은 쟤 머냐 할 법한 코드들이 나름 우아하게 짠 아키텍쳐에 박혀있으니... 아마 비웃는 사람도 많았을 것이다.

근데... 이게 익숙하지 않아서 인지 어제 작업을 하다가 정렬 할 일이 있어 구글링으로 정렬하는 법을 또 찾았으니... 내 블로그에 정리하면서 절대로 안잊어 버리게 할 심산으로 포스팅 해본다.

1. Objective-C에서 NSArray의 정렬법

(1) 정렬하려고 하는 Object 클래스에 정렬 방법에 대한 함수를 만든다. 아래 예제에서는 compare라는 이름으로 구현하였다.

@interface MessageItem : NSObject

@property (strong, nonatomic) NSDate *time;
@property (strong, nonatomic) NSString *message;

- (NSComparisonResult)compare:(MessageItem*)item;

@end

@implementation MessageItem

@synthesize time = _time;
@synthesize message = _message;


- (NSComparisonResult)compare:(MessageItem*)item
{
    // 시간 순으로 정렬
    return [self.time compare:item.time];
}

@end

(2) 사용하는 부분에서 NSArray에 모두 추가한 후 sortUsingSelector 함수로 정렬한다.

NSMutableArray* array = [NSMutableArray array];

[array addObject:messageItem1];
[array addObject:messageItem2];
[array addObject:messageItem3];
[array addObject:messageItem4];
[array addObject:messageItem5];


[array sortUsingSelector:@selector(compare:)];

이렇게 하면 messageItem1부터 5까지에 대해 시간 순으로 정렬이 된다. compare 함수를 잘 조절하면 시간의 역순이나 message의 알파벳 내림차순/오름차순으로 정렬이 가능하다.


2. Java에서의 정렬법

(1) 정렬하려고 하는 Object 클래스를 만든다.


public class MessageItem
{
    public Date date;
    public String message;
}

(2) 사용하는 부분에서 Vector에 모두 추가한 후 Collections.sort 함수로 정렬한다. 정렬 비교 클래스는 재사용을 많이 할 경우에는 따로 구현하고 아니면 아래 예제처럼 구현해도 좋을 듯.

Vector array = new Vector();

array.add(messageItem1);
array.add(messageItem2);
array.add(messageItem3);
array.add(messageItem4);
array.add(messageItem5);

Collections.sort(array, new Comparator()
{
    @Override

    public int compare(MessageItem messageItem1, MessageItem messageItem2)
    {
        return (int)(messageItem1.time.getTime() - messageItem2.time.getTime())
    }
});

쓰고 보니 안드로이드와 아이폰에만 국한된 문제가 아니라 Objective-C와 Java모두에 해당되는 내용이다. 위 예제는 똑같이 작동하는 두 언어에 대해 예제이니 여러개 언어를 하실 분들은 참고 바란다.


댓글 없음: