2011-05-23 47 views
1

我在Objective-C中對多維數組進行排序時遇到了一些麻煩。我基本上有一個數組,其中每個元素是一種形式的數組:Objective-C,對多維數組進行排序

(NSString, NSDate, NSString, NSString) 

這樣,我的最高水平數組的形式爲:

(
(NSString, NSDate, NSString, NSString), 
(NSString, NSDate, NSString, NSString), 
(NSString, NSDate, NSString, NSString), 
(NSString, NSDate, NSString, NSString), 
... 
) 

我希望能夠將元素進行排序基於任何自己的元素的頂級數組。我寫了下面這樣的代碼,但是對於我正在處理的大型數據集來說,證明它效率太低。

-(NSMutableArray *) sortArrayByDate:(NSMutableArray *) unsortedArray { 

    NSMutableArray * sortedArray = [[NSMutableArray alloc ] init ]; 

    while ([unsortedArray count]>0) { 
     int topIndex = 0; 
     NSDate * topDate = [[NSDate alloc] initWithString:@"1970-01-01 00:00:00 +0600"]; 
     for(int j=0;j<[unsortedArray count];j++) { 
      NSDate * targetDate = [[unsortedArray objectAtIndex:j] objectAtIndex:1]; 
      if ([targetDate compare:topDate] == NSOrderedDescending) { 
       topDate = targetDate; 
       topIndex = j; 
      }    
     } 
     [sortedArray addObject:[unsortedArray objectAtIndex:topIndex]]; 
     [unsortedArray removeObjectAtIndex:topIndex];   
    }  
    return sortedArray; 
} 

任何人都可以請有關如何完成使用或者sortUsingSelector或sortUsingDescriptor的更成熟的方法,這項任務有何建議?如果我正在整理一維數組我認爲這將是這樣的:

[unsortedArray sortUsingSelector: @selector(compare:)] 

但我怎麼告訴它使用我向它傳遞陣列中第n值進行排序?

- 許多感謝

- 許多感謝

回答

3

在大多數情況下,你會創建一個對象:

@interface MONObject : NSObject 
{ 
    NSString * a; 
    NSDate * b; 
    NSString * c; 
    NSString * d; 
} 
... 

然後教它自己和別人比較,然後用在這些對象陣列。邏輯組織的數據和實施。

+0

謝謝,這不是我正在尋找的答案,但它是一個快速高效的解決方案。 – 2011-05-23 21:48:39

+0

不客氣。在某些情況下,對問題的間接解決方案是最好的。祝你好運! – justin 2011-05-23 22:04:47

2

還可以使用塊爲基礎的方法在sortUsingComparator:NSMutableArray這樣的 -

[myArray sortUsingComparator:^(id first, id second){ 
    id firstObject = [first objectAtIndex:1]; 
    id secondObject = [second objectAtIndex:1]; 

    return [firstObject compare:secondObject]; 
}] 

也具有平行的方法中sortedArrayUsingComparator:NSArray將噴涌出排序後的數組。

排序通過改變索引

typedef NSComparator (^ComparatorFactory)(id); 

ComparatorFactory comparatorForIndex = ^NSComparator(id context) { 
    NSInteger index = [(NSNumber*)context integerValue]; 
    NSComparator comparator = ^(id first, id second) { 
     id firstObject = [first objectAtIndex:index]; 
     id secondObject = [second objectAtIndex:index]; 

     return [firstObject compare:secondObject]; 
    }; 

    return [[comparator copy] autorelease]; 
}; 

[myArray sortUsingComparator:comparatorForIndex([NSNumber numberWithInteger:1])]; 

取決於傳入的索引,陣列將挑選基於該索引處的對象。這是非常基本的代碼,但您可以添加到此。

相關問題