2013-08-23 99 views
1

我想弄清楚基於我定義的自定義排序方案排列數組中對象的整齊方式。按特定順序排序自定義對象

在下面的例子中,如果我打印出我的未排序數組中的每個對象的「someText」值,我希望的輸出是。

- >牛 - >牛 - >豬 - >狗

什麼是實現這個自定義排序我最好的選擇?

NSArray *[email protected][@"Cow",@"Pig",@"Dog"]; 


@interface TestObject : NSObject 

@property (strong, nonatomic) NSString *someText; 

@end 


@interface Test : NSObject 

@property (strong, nonatomic) NSMutableArray *unSortedObjects; 

@end 

@implementation Test 

-(void)setup 
{ 
TestObject *t1=[Test alloc]init]; 
[email protected]"Dog"; 
[unSortedObjects addObject:t1]; 
TestObject *t2=[Test alloc]init]; 
[email protected]"Pig"; 
[unSortedObjects addObject:t2]; 
TestObject *t3=[Test alloc]init]; 
[email protected]"Cow"; 
[unSortedObjects addObject:t3]; 
[email protected]"Cow"; 
[unSortedObjects addObject:t4]; 

} 



@end 
+1

請參考此鏈接http://iphonedevsdk.com/forum/iphone-sdk-tutorials/76540-sorting- arrays-of-objects.html –

回答

4

您可以使用的NSMutableArray功能sortUsingComparator:。如果爲了僅僅取決於「someText」值,那麼天真的實現可能像:

[panels_ sortUsingComparator:^NSComparisonResult(TestObject* obj1, TestObject* obj2) { 
      NSArray *scheme = @[@"Cow",@"Pig",@"Dog"]; 
      NSUInteger ix1 = [scheme indexOfObject:obj1.someText]; 
      NSUInteger ix2 = [scheme indexOfObject:obj2.someText]; 
      if (ix1 < ix2){ 
       return NSOrderedAscending; 
      } 
      else if (ix1 > ix2){ 
       return NSOrderedDescending; 
      } 
      return NSOrderedSame; 
     }]; 
+0

這有效。奇怪的是,我不得不從NSUInteger定義中刪除「*」指針類型,因爲編譯器抱怨指向整型轉換。此外,爲了未來的搜索者的利益,小錯字:你有「obj1」兩次定義。謝謝! – dubbeat

+0

修正了拼寫錯誤,感謝您列出它們,對於不精確的答案感到抱歉 – Vladimir

1

您可以輕鬆地做到這一點與:

NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) { 
    //Here you can return NSOrderedSame, NSOrderedAscending or NSOrderedDescending 
    //based on your logic 
}]; 
0
[unSortedObjects sortUsingComparator: ^(id obj1, id obj2) { 
    if ([scheme indexOfObject:obj1] > [scheme indexOfObject:obj2]) { 
     return (NSComparisonResult)NSOrderedDescending; 
    } 

    if ([scheme indexOfObject:obj1] < [scheme indexOfObject:obj2]) { 
     return (NSComparisonResult)NSOrderedAscending; 
    } 

    return (NSComparisonResult)NSOrderedSame; 
}];