iPhone: Sort an Array of Custom Object


iPhone: Sort an Array of Custom Object

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

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


@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;

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

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


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];

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


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

NSArray *arraySDT = [NSArray arrayWithObject:sortDescriptor];

NSArray *rsSort = [listBillionaires sortedArrayUsingDescriptors:arraySDT];

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

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


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

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

  • initWithKey คือ property ของคลาสที่เราจะเรียงตาม ตัวอย่างผมใช้ @”idMan” หากเราจะเรียงตาม property อื่นก็เปลี่ยนชื่อตรงนี้นะครับ
  • ascending คือ การเรียงตามลำดับน้อยไปหามาก ใส่ค่า NO/YES หากใส่ YES จะเรียงจากน้อยไปมาก ใส่ NO จะเรียงจากมากไปน้อย

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

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


NSArray *arraySDT = [NSArray arrayWithObject:sortDescriptor];

NSArray *rsSort = [listBillionaires sortedArrayUsingDescriptors:arraySDT];

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

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

Reference

adaydesign :)

About adaydesign

นักพัฒนาแอพพลิเคชั่นบนโมบาย [iPhone Android] คนหนึ่งซึ่งอยากจะบันทึกเรื่องราวของเส้นทางนักพัฒนาโมบายแอพพลิเคชั่นเอาไว้ในบล็อคน้อยๆ แห่งนี้ เผื่อจะแบ่งบันและแลกเปลี่ยนความรู้ให้กับคนอื่นๆ ได้บ้าง :) Mobile Application Developer; Flash Mobile, iPhone/iPad, Android Mobile Phone/Tablet and Blackberry Playbook.

Posted on มิถุนายน 19, 2011, in [Dev] iOS and tagged , , . Bookmark the permalink. ใส่ความเห็น.

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: