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];
}
4

2 に答える 2

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;
    }
}];
于 2013-02-04T11:57:04.783 に答える
-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;
        }
    }
}
于 2013-02-05T18:37:49.010 に答える