2013-02-04 166 views
0

我有一個自定義對象數組。這些對象表示二進制文件中的段。 屬性loc在文件中保存對象自己的位置,其中prev保存「上一個」對象的位置。在此情況下,「上一個」和「下一個」並不一定意味着該對象在文件中彼此相繼出現。 第一個對象有prev = 0。最後一個對象沒有後續對象,其位置保持爲prev按父親兒童排序數組

我該如何實現這樣的排序?最初不知道對象的數量。

//My custom object 
@interface MyObject : NSObject 

@property (nonatomic, assign) NSInteger loc, prev; 

@end 

//In the implementation of some other class 
NSMutableArray *array = [NSMutableArray new]; 

{// order should be 6 
    MyObject *obj = [MyObject new]; 
    obj.loc = 3000; 
    obj.prev = 111; 
    [array addObject:obj]; 
} 
{// order should be 2 
    MyObject *obj = [MyObject new]; 
    obj.loc = 2000; 
    obj.prev = 222; 
    [array addObject:obj]; 
} 
{// order should be 4 
    MyObject *obj = [MyObject new]; 
    obj.loc = 333; 
    obj.prev = 4000; 
    [array addObject:obj]; 
} 
{// order should be 1 
    MyObject *obj = [MyObject new]; 
    obj.loc = 222; 
    obj.prev = 5000; 
    [array addObject:obj]; 
} 
{// order should be 5 
    MyObject *obj = [MyObject new]; 
    obj.loc = 111; 
    obj.prev = 333; 
    [array addObject:obj]; 
} 
{// order should be 3 
    MyObject *obj = [MyObject new]; 
    obj.loc = 4000; 
    obj.prev = 2000; 
    [array addObject:obj]; 
} 
{// order should be 0 
    MyObject *obj = [MyObject new]; 
    obj.loc = 5000; 
    obj.prev = 0; 
    [array addObject:obj]; 
} 
+0

數組包含什麼? – 2013-02-04 11:01:17

+0

對象,每個對象都有其ID和父ID。 –

+0

這是一個很奇怪的問題。你知道哪一段是最後一段嗎?或者第一個? – Sulthan

回答

1

嘗試使用辭書排序:

NSArray *sorted = [array sortedArayUsingComparator:^(id obj1, id obj2) { 
    if ([obj1 parentID] < [obj2 parentID] { 
     return NSOrderedAscending; 
    } else if ([obj1 parentID] > [obj2 parentID] { 
     return NSOrderedDescending; 
    } else if ([obj1 ID] < [obj2 ID] { 
     return NSOrderedAscending; 
    } else if ([obj1 ID] > [obj2 ID] { 
     return NSOrderedDescending; 
    } else { 
     return NSOrderedSame; 
    } 
}]; 
+0

我的問題描述得很差。我重新提出了這個問題。 –

-1

沒關係,我知道了。

NSMutableArray *unordered = [[NSMutableArray alloc] initWithArray:array]; 
NSMutableArray *ordered = [NSMutableArray new]; 

for(MyObject *myObj in array) 
{ 
    if(!myObj.prev) 
    { 
     [orderedTables addObject:myObj]; 
     [unorderedTables removeObject:myObj]; 
     break; 
    } 
} 

int counter = 0; 
while(unordered.count && counter < ordered.count) 
{ 
    MyObject *obj1 = [ordered objectAtIndex:counter++]; 

    for(int i = 0; i < unordered.count; ++i) 
    { 
     MyObj *obj2 = [unordered objectAtIndex:i]; 

     if(obj2.prev == obj1.loc) 
     { 
      [ordered addObject:obj2]; 
      [unordered removeObject:obj2]; 
      break; 
     } 
    } 
} 
+0

H2C03的答案爲您提供了一個很好的解決方案,簡單易懂並使用快速(本地)排序算法。你正在實現一個排序算法,它是最慢的(在維基百科上稱爲「天真」)排序算法。 – Sulthan

+0

其實,再看看你的問題,這根本就沒有排序。您需要編制索引,例如使用'NSDictionary'。 – Sulthan