2012-03-01 11 views
58

辞書が配列されており、辞書のキーの1つの値でアルファベット順にソートする必要があります。辞書のNSArrayを辞書のキーの値で並べ替えます

これは私の配列です:?私は

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

を使用する配列をソートしかし、どのようにソート辞書のbrandキーを使用しないため、通常

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; 
} 
) 

答えて

105

私は、これはそれを行うだろうと思う:

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

私はSort Descriptor Programming Topicsからコードを引っ張りました。また、sortedArrayUsingDescriptors:がの各要素にvalueForKey:を送信し、標準コンパレータを使用して返された値を並べ替えることで、Key-Value Codingが再生されます。

+0

swift2でこれをどのように使用するのですか? –

1

ちょうどあなたがこれを行うことができます...

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

最も簡単な方法は、それを試してみてください。

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

私たちは、メソッドを使用してソリューションを手に入れた

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

どこに従う: -

jsonDataを - MutableArray解析されたJSONデータを保持します。

fullname - 並べ替えるデータ。

id - 内側の辞書に付随するユニークなデータ。 QEDのコードへの追加として

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

sortedArrayUsingComparatorは、「objectForKey」を2回コールするのではなく、「valueForKey」を最大4回コールすることが悪い方法です。 BTW。辞書を期待しているので、idではなくNSDictionary *を型として使用します。 – gnasher729

3

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

これは、変数のクラスを明確にし、高速列挙した配列の作成を最適化します。 おかげswitfで

6

:ソート辞書から「ブランド」キーを使用するためのコードを以下の

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

使用..

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

利用コード以下、ソートに使用すると、2つのキーを従っている場合辞書から;同様に、「ブランド」辞書からキーとproductTitleキー: -

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

NSSortDescriptorを使用するときに私のコードがクラッシュしていましたので、私は「ランク」を期待してい私のユースケースで素晴らしい作品のブロックを使用して終了しましたNSNumberになるようにします。オブジェクトを整数に変換できない場合、オブジェクトはソートされませんが、クラッシュは発生しません。

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; 
}]; 
関連する問題