2014-03-01 64 views
1

我有一個由兩個文本字段組成的NSArray對象類。我想排序這些對象的升序,我已經完成了這與NSDictionary對象之前,但是現在我已經改變,然後我已經做了一個對象類,所以我真的不知道如何比較值以獲得排序的數組。對包含NSNumber變量的NSobjects的NSArray進行排序

對象變量是NSNumbers但只包含數字值,我認爲這會影響事情。

這是我用我的舊代碼對NSDictionary值進行排序的方式。

NSArray *tempSortedItemsArray = [installArray sortedArrayUsingDescriptors: 
          @[[NSSortDescriptor 
           sortDescriptorWithKey:@"first" ascending:YES], 
          [NSSortDescriptor 
          sortDescriptorWithKey:@"second" ascending:YES]]]; 

    sortedItemsArray = [tempSortedItemsArray mutableCopy]; 
    tempSortedItemsArray = nil; 

所以,如果我有對象的這樣

(第一/第二)的陣列

2 1 
0 0 
1 0 
1 1 
2 2 
2 0 
3 0 

如果將排序這樣

0 0 
1 0 
1 1 
2 0 
2 1 
2 2 
3 0 

任何幫助調節該對具有NSNumber變量第一個和第二個變量的NSObject類將非常適用。

+1

爲什麼要排序包含文本字段的對象數組?爲什麼自定義對象不包含數據?我認爲你在做一些奇怪的事情。 – trojanfoe

回答

1
[arr sortUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
    NSString *first=[NSString stringWithFormat:@"%d%d",obj1.num1.intValue,obj1.num2.intValue]; 
NSString *second=[NSString stringWithFormat:@"%d%d",obj2.num1.intValue,obj2.num2.intValue]; 
    return [first compare:second options:NSNumericSearch]; 

}]; 
+0

哎呀,對象變量實際上是NSNumbers,請問我可以查看我更新的問題嗎? – HurkNburkS

+0

@HurkNburkS檢查更新的答案 –

+0

這沒有相當的工作我認爲我沒有足夠明確的在我的問題..其關閉它排序第一個var ...但不是第二個var,在我的排序對象的例子..不斷嘗試 – HurkNburkS

0

您可以使用NSArray的其他種類的方法,如:

  • sortedArrayUsingFunction:context:
  • sortedArrayUsingSelector:
  • sortedArrayUsingComparator:
+0

也許你應該提供一些這些方法的例子用法? – trojanfoe

0

由於工作原理是這樣的對象:

@interface Object : NSObject 

@property (copy) NSNumber *first; 
@property (copy) NSNumber *second; 

+(Object *)objectWithWithFirst:(NSNumber *)first second:(NSNumber *)second; 

@end 


@implementation Object 

+(Object *)objectWithWithFirst:(NSNumber *)first second:(NSNumber *)second { 
    Object *object = [[Object alloc] init]; 
    object.first = first; 
    object.second = second; 
    return object; 
} 


-(NSString *)description { 
    return [NSString stringWithFormat:@"%@ %@", _first, _second]; 
} 

@end 

您可以用

NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(Object *obj1, Object *obj2) { 
    NSComparisonResult result = [obj2.second compare:obj2.second]; 
    if (result == NSOrderedSame) 
     result = [obj1.first compare:obj2.first]; 
    return result; 
}]; 

實例進行排序:

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     NSArray *array = @[ 
          [Object objectWithWithFirst:@2 second:@1], 
          [Object objectWithWithFirst:@0 second:@0], 
          [Object objectWithWithFirst:@1 second:@0], 
          [Object objectWithWithFirst:@1 second:@1], 
          [Object objectWithWithFirst:@2 second:@2], 
          [Object objectWithWithFirst:@2 second:@0], 
          [Object objectWithWithFirst:@3 second:@0] 
          ]; 

     NSLog(@"%@", array); 

     NSArray *sorted = [array sortedArrayUsingComparator:^NSComparisonResult(Object *obj1, Object *obj2) { 
      NSComparisonResult result = [obj2.second compare:obj2.second]; 
      if (result == NSOrderedSame) 
       result = [obj1.first compare:obj2.first]; 
      return result; 
     }]; 

     NSLog(@"%@", sorted); 
    } 
    return 0; 
} 

這將很好地工作在你的樣本數據。當然,您可以將比較器代碼直接放入對象類中 - 清理變得更加簡單。

0

如果您的自定義類具有屬性firstsecond那麼您發佈的代碼將會正常工作。

NSNumber已經知道如何將自己與其他數字進行比較。 NSSortDesvriptor與任何實現鍵值編碼讀取部分的對象一起工作。所有NSObject子類都會自動爲遵循普通約定的任何屬性執行此操作。 @property遵循普通慣例。

相關問題