일을 시작하고는 초반에...링크드 리스트(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모두에 해당되는 내용이다. 위 예제는 똑같이 작동하는 두 언어에 대해 예제이니 여러개 언어를 하실 분들은 참고 바란다.
댓글 없음:
댓글 쓰기