Tengo un NSArray de los objetos.
Los objetos tienen un int atributo llamado «distancia». Me gustaría ordenar mi matriz por la distancia.

Podría alguien por favor decirme cómo hacerlo ? No puedo entender cómo la sortUsingSelector o sortUsingDescriptor métodos de trabajo son…

Gracias

OriginalEl autor Yoot | 2010-05-17

2 Comentarios

  1. 27

    Supongo que usted está usando un NSMutableArray, porque un NSArray es inmutable.

    Cuando se ordena algo, quiere que el resultado final sea arreglado como

    x1 <= x2 <= x3 <= x4 <= ... <= xN

    Cómo definir este <=? Hay 3 soluciones en ObjC.


    1. -sortUsingSelector:

    [arr sortUsingSelector:@selector(foo:)] significa que sus elementos se compara como*

    x <= y      is equivalent to      [x foo:y] <= 0

    Por ejemplo, para ordenar una lista de cadenas de caracteres a mayúsculas-minúsculas, uso [arr sortUsingSelector:@selector(caseInsensitiveCompare:)].


    2. -sortUsingFunction:context:

    Esto es similar a -sortUsingSelector:, pero utiliza un puntero a función como entrada. [arr sortUsingFunction:funcptr context:ctx] significa que sus elementos se compara como

    x <= y      is equivalent to      funcptr(x, y, ctx) <= 0

    3. -sortUsingDescriptors:

    Este es el más complicado. Toma una lista de NSSortDescriptors que describen el orden esperado de las propiedades. Un ejemplo básico:

    NSSortDescriptor* desc = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES];
    [arr sortUsingDescriptors:[NSArray arrayWithObject:desc]];
    [desc release];

    el descriptor indica el tipo de rutina para «ordenar por la clave distance en orden ascendente».

    Supongamos que hay 2 claves, números enteros x ascendente y, a continuación, las cadenas de y descendente, entonces usted puede escribir

    NSSortDescriptor* dx = [[NSSortDescriptor alloc] initWithKey:@"x" ascending:YES];
    NSSortDescriptor* dy = [[NSSortDescriptor alloc] initWithKey:@"y" ascending:NO selector:@selector(caseInsensitiveCompare:)];
    [arr sortUsingDescriptors:[NSArray arrayWithObjects:x, y, nil]];
    [dx release];
    [dy release];

    y así sucesivamente.


    Nota: * en Realidad, usted sólo debe devolver -1, 0 o 1.

    +1, excepto que usted no devuelve -1, 0 o 1. Volver NSOrderedDescending, NSOrderedSame, o NSOrderedAscending.
    +1, excepto [NSArray arrayWithObjects:x, y, nil]]; probablemente se debe dx, dy como los objetos pasan a la matriz.
    ¿Qué pasa si la matriz no tiene distancia de la propiedad, sólo la latitud y la longitud y tiene un método que calcula la distancia de userLocation para cada latitud/longitud coordenadas. ¿Qué debo hacer para ordenar la matriz, entonces?

    OriginalEl autor kennytm

  2. 3

    Por fin he encontrado la manera de hacerlo :

    después de @ejecución :

    static NSInteger sort(Myclass *obj1, Myclass *obj2, void *context) {
    
    if(obj1.distance < obj2.distance)
    return NSOrderedAscending;
    else if(obj1.distance > obj2.distance)
    return NSOrderedDescending;
    else
    return NSOrderedSame;

    , A continuación, dondequiera que usted necesita para ordenar su NSArray :

    NSArray *sortedArray = [unsortedArray sortedArrayUsingFunction:sort context:NULL];

    OriginalEl autor Yoot

Dejar respuesta

Please enter your comment!
Please enter your name here