2013-08-23 104 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; 
}];