วันจันทร์ที่ 20 มิถุนายน พ.ศ. 2554

iPhone: Sort an Array of Custom Object

iPhone: Sort an Array of Custom Object
บทความนี้จะพูดถึงการเรียงลำดับสมาชิกในอาเรย์ที่เป็นคลาสที่เราสร้างเองนะครับ โดยการเรียงนั้นสามารถเรียงจากค่า Property ได้เลย โดยเป็นค่า Property ที่มีคลาสที่สามารถเปรียบเทียบกันได้อยู่แล้วเช่น NSString, NSInteger, int, float, double, long เป็นต้นครับ


เริ่มต้นด้วยการสร้างคลาสของเราก่อนนะครับ คลาสตัวอย่างชื่อ Billionaire มีโครงสร้างดังนี้

[sourcecode langauge="objc"]

@interface Billionaire : NSObject {
NSString *name;
NSInteger idMan,age,money;
}

@property (nonatomic,retain) NSString *name;
@property (nonatomic,readwrite) NSInteger idMan,age,money;

-(id)initWithName:(NSString*)_name manId:(NSInteger)_id age:(NSInteger)_age money:(NSInteger)_money;

[/sourcecode]

เมื่อได้คลาสแล้วเริ่มต้นการทดสอบการเรียงลำดับในอาเรย์ได้เลยครับ

1. สร้างอาเรย์มาหนึ่งตัวเพื่อเก็บข้อมูล

[sourcecode language="objc"]

listBillionaires = [[NSMutableArray alloc] init];

//add member
Billionaire *a = [[Billionaire alloc] initWithName:@"MM2000" manId:1 age:24 money:2000];
Billionaire *b = [[Billionaire alloc] initWithName:@"PP2000" manId:2 age:15 money:5000];
Billionaire *c = [[Billionaire alloc] initWithName:@"AA2000" manId:3 age:41 money:2000];
Billionaire *d = [[Billionaire alloc] initWithName:@"DD2000" manId:4 age:32 money:1000];
Billionaire *e = [[Billionaire alloc] initWithName:@"YY2000" manId:5 age:60 money:2500];
Billionaire *f = [[Billionaire alloc] initWithName:@"EE2000" manId:6 age:24 money:2300];
Billionaire *g = [[Billionaire alloc] initWithName:@"GG2000" manId:7 age:22 money:2200];

[listBillionaires addObject:a];
[listBillionaires addObject:b];
[listBillionaires addObject:c];
[listBillionaires addObject:d];
[listBillionaires addObject:e];
[listBillionaires addObject:f];
[listBillionaires addObject:g];

[a release];
[b release];
[c release];
[d release];
[e release];
[f release];
[g release];

[/sourcecode]

2. ฟังก์ชั่นการจัดเรียง โดยใช้ NSSortDescriptor

[sourcecode langauge="objc"]

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"idMan" ascending:YES];

NSArray *arraySDT = [NSArray arrayWithObject:sortDescriptor];

NSArray *rsSort = [listBillionaires sortedArrayUsingDescriptors:arraySDT];

[/sourcecode]

อธิบายเพิ่มเติม

2.1 การจัดเรียงโดยใช้ NSSortDescriptor เราต้องสร้าง instance ของ NSSortDesciptor ก่อน

[sourcecode langauge="objc"]

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"idMan" ascending:YES];

[/sourcecode]

การสร้าง NSSortDescriptor จะมีพารามิเตอร์คือ initWithKey และ ascending

  • initWithKey คือ property ของคลาสที่เราจะเรียงตาม ตัวอย่างผมใช้ @"idMan" หากเราจะเรียงตาม property อื่นก็เปลี่ยนชื่อตรงนี้นะครับ

  • ascending คือ การเรียงตามลำดับน้อยไปหามาก ใส่ค่า NO/YES หากใส่ YES จะเรียงจากน้อยไปมาก ใส่ NO จะเรียงจากมากไปน้อย


2.2 การรับผลลัพธ์จากการเรียงลำดับด้วยฟังก์ชั่น sortedArrayUsingDescriptors:(NSArray*)

เราต้องทำ NSSortDescriptor อยู่ในรูปของ Array เสียก่อนแล้วจึงเรียกใช้ฟังก์ชั่นนี้ได้

[sourcecode langauge="objc"]

NSArray *arraySDT = [NSArray arrayWithObject:sortDescriptor];

NSArray *rsSort = [listBillionaires sortedArrayUsingDescriptors:arraySDT];

[/sourcecode]

จากตัวอย่างโค้ด arraySDT คือ อาเรย์ที่เราสร้างจาก sortDescriptor และผลลัพธ์การจัดเรียงจะถูกรีเทิร์นออกมาในอาเรย์ rsSort ให้เรานำไปใช้ต่อไปได้ ดังตัวอย่างผลลัพธ์ตามภาพด้านล่างครับ


เป็นอย่างไรบ้างครับ วิธีการจัดเรียงข้อมูลคลาสในอาเรย์ ทำง่ายๆ แค่บรรทัดเดียวเอง แต่วิธีการจัดเรียงข้อมูลในอาเรย์มีอยู่หลายฟังก์ชั่นนะครับ ลองศึกษาดูกันได้ และเช่นเคยหากเพื่อนๆ คนไหนสงสัยหรือมีข้อแนะนำเชิญเม้นเข้ามาได้เลยนะครับ สวัสดีครับ

Reference

adaydesign :)

ไม่มีความคิดเห็น:

แสดงความคิดเห็น