2012-03-01 46 views
58

Tôi có một mảng được điền theo từ điển và tôi cần sắp xếp mảng theo thứ tự bảng chữ cái theo các giá trị của một trong các khóa của từ điển.Sắp xếp NSArray của từ điển theo giá trị của một khóa trong từ điển

Đây là mảng của tôi:

tu dictus: (
    { 
    brand = Ryul; 
    productTitle = Any; 
    quantity = 1; 
    subBrand = "Ryul INJ"; 
    type = Product; 
}, 
    { 
    brand = Trol; 
    productTitle = Different; 
    quantity = 2; 
    subBrand = ""; 
    type = Brand; 
}, 
    { 
    brand = Dtor; 
    productTitle = Any; 
    quantity = 1; 
    subBrand = ""; 
    type = Product; 
}, 
    { 
    brand = Ryul; 
    productTitle = Different; 
    quantity = 2; 
    subBrand = "Ryul CHES"; 
    type = SubBrand; 
}, 
    { 
    brand = Anan; 
    productTitle = Any; 
    quantity = 1; 
    subBrand = ""; 
    type = Product; 
} 
) 

Thông thường để phân loại một mảng tôi sẽ sử dụng

myArray = [uniqueProdsArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 

Nhưng làm thế nào để loại sử dụng brand chủ chốt của từ điển?

Trả lời

105

Tôi nghĩ rằng điều này sẽ làm điều đó:

brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES]; 
sortDescriptors = [NSArray arrayWithObject:brandDescriptor]; 
sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors]; 

Tôi kéo mã từ Sort Descriptor Programming Topics. Ngoài ra, Key-Value Coding có hiệu lực, trong đó sortedArrayUsingDescriptors: sẽ gửi valueForKey: tới từng phần tử trong myArray và sau đó sử dụng bộ so sánh tiêu chuẩn để sắp xếp các giá trị được trả về.

+0

cách sử dụng tính năng này trong swift2? –

1

Chỉ cần cố gắng nó ra cách dễ nhất ...

myArray = [[NSMutableArray alloc] init]; 
NSMutableArray *tempArray = [[NSMutableArray alloc] init]; 
[tempArray removeAllObjects]; 
[tempArray addObjectsFromArray: myArray]; 

NSString *key = @"brand"; 
NSSortDescriptor *brandDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObjects:brandDescriptor,nil]; 
NSArray *sortedArray = [tempArray sortedArrayUsingDescriptors:sortDescriptors]; 
[brandDescriptor release]; 
[tempArray removeAllObjects]; 
tempArray = (NSMutableArray*)sortedArray; 
[myArray removeAllObjects]; 
[myArray addObjectsFromArray:tempArray]; 
1

bạn có thể làm điều này.

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateFormat:@"d LLLL yyyy"]; 

NSComparator compareDates = ^(id string1, id string2) 
{ 
    NSDate *date1 = [formatter dateFromString:string1]; 
    NSDate *date2 = [formatter dateFromString:string2]; 

    return [date1 compare:date2]; 
}; 
NSSortDescriptor * sortDesc1 = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO comparator:compareDates]; 
[array sortUsingDescriptors:[NSArray arrayWithObjects:sortDesc1, nil]]; 
8

We Got Giải pháp theo phương pháp Làm theo

[self.jsonData sortUsingDescriptors: [NSArray arrayWithObjects: [NSSortDescriptor sortDescriptorWithKey:"fullname" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:"id" ascending:NO], nil]]; 

Trong đó: -

jsonData - MutableArray nào giữ JSON dữ liệu phân tích cú pháp.

fullname - dữ liệu chúng tôi muốn sắp xếp.

id - Dữ liệu duy nhất đi kèm với từ điển bên trong.

1
NSSortDescriptor *brandDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"Position" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease]; 
     NSArray *sortDescriptors = [NSArray arrayWithObject:brandDescriptor]; 
     NSArray *sortedArray = [arrTemp sortedArrayUsingDescriptors:sortDescriptors]; 
    array_PreLagData=(NSMutableArray*)sortedArray; 

unsorted array 
Printing description of arrTemp: 
<__NSArrayM 0x10282100>(
{ 
    Milker2 = "11:03:17 AM"; 
    Position = 2; 
}, 
{ 
    Milker1 = "11:03:28 AM"; 
    Position = 25; 
}, 
{ 
    Milker3 = "11:03:18 AM"; 
    Position = 3; 
}, 
{ 
    Milker1 = "11:03:16 AM"; 
    Position = 1; 
    Strip = "11:32:32 AM"; 
}, 
{ 
    Milker1 = "11:03:21 AM"; 
    Position = 10; 
} 
) 
Sorted array 
<__NSArrayI 0x101363c0>(
{ 
    Milker1 = "11:03:16 AM"; 
    Position = 1; 
    Strip = "11:32:32 AM"; 
}, 
{ 
    Milker2 = "11:03:17 AM"; 
    Position = 2; 
}, 
{ 
    Milker3 = "11:03:18 AM"; 
    Position = 3; 
}, 
{ 
    Milker1 = "11:03:21 AM"; 
    Position = 10; 
}, 
{ 
    Milker1 = "11:03:28 AM"; 
    Position = 25; 
} 
) 

[enter link description here][1] 


    [1]: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html#//apple_ref/doc/uid/20001845-BAJEAIEE 
3
arrSorted = [arrBrand sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
      if ([[obj1 valueForKey:@"iUserId"] integerValue] > [[obj2 valueForKey:@"iUserId"] integerValue]) { 
       return (NSComparisonResult)NSOrderedDescending; 
      } 
      if ([[obj1 valueForKey:@"iUserId"] integerValue] < [[obj2 valueForKey:@"iUserId"] integerValue]) { 
       return (NSComparisonResult)NSOrderedAscending; 
      } 
      return (NSComparisonResult)NSOrderedSame; 
     }]; 
+0

Trong khi sắp xếpArraySử dụngComparator là cách để đi, có đến bốn cuộc gọi đến "valueForKey" thay vì hai cuộc gọi đến "objectForKey" là xấu. BTW. Vì bạn mong đợi từ điển, hãy sử dụng NSDictionary * làm loại, chứ không phải id. – gnasher729

3

Như một sự bổ sung mã QED của,

NSSortDescriptor * brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES]; 
NSArray * sortedArray = [myArray sortedArrayUsingDescriptors:@[brandDescriptor]]; 

này làm rõ các lớp học của các biến và tối ưu hóa việc tạo mảng với nhanh liệt kê. Cảm ơn

6

Trong switf:

var descriptor: NSSortDescriptor = NSSortDescriptor(key: "brand", ascending: true) 
var sortedResults: NSArray = results.sortedArrayUsingDescriptors([descriptor]) 
4

Sử dụng sau mã cho loại sử dụng "thương hiệu" chìa khóa từ điển ..

NSSortDescriptor * brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES]; 
NSArray * sortDescriptors = [NSArray arrayWithObject:brandDescriptor]; 
NSArray * sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors]; 
NSLog(@"sortedArray %@",sortedArray); 

Sử dụng đoạn mã sau: Nếu bạn sắp xếp theo hai phím từ điển; Giống như, "thương hiệu" chìa khóa và chìa khóa productTitle từ điển: -

NSSortDescriptor * brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES]; 
NSSortDescriptor * productTitleDescriptor = [[NSSortDescriptor alloc] initWithKey:@"productTitle" ascending:YES]; 
NSArray * sortDescriptors = [NSArray arrayWithObjects:brandDescriptor, productTitleDescriptor, nil]; 
NSArray * sortedArray = [feedData sortedArrayUsingDescriptors:sortDescriptors]; 
NSLog(@"sortedArray %@",sortedArray); 
2

Mã của tôi bị đâm khi sử dụng NSSortDescriptor để kết thúc sử dụng một khối mà hoạt động tuyệt vời trong trường hợp sử dụng của tôi, nơi tôi đang mong đợi các "bậc" là một NSNumber.Nếu đối tượng không thể được chuyển đổi thành một số nguyên thì nó sẽ không sắp xếp nhưng nó cũng sẽ không gây ra sự cố.

NSArray *sortedArray = [data sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    long data1 = [[obj1 valueForKey:@"rank"] integerValue]; 
    long data2 = [[obj2 valueForKey:@"rank"] integerValue]; 
    if (data1 > data2) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 
    if (data1 < data2) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 
    return (NSComparisonResult)NSOrderedSame; 
}]; 
Các vấn đề liên quan