2013-02-04 106 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