Tengo una matriz poblada por los diccionarios, y necesito ordenar la matriz en orden alfabético por los valores de una de las claves de los diccionarios.

Este es mi matriz:

tu dictus: (
    {
    brand = Ryul;
    productTitle = Any;
    quantity = 1;
    subBrand = "Ryul INJ";
    type = Product;
},
    {
    brand = Trol;
    productTitle = Different;
    quantity = 2;
    subBrand = "";
    type = Brand;
},
    {
    brand = Dtor;
    productTitle = Any;
    quantity = 1;
    subBrand = "";
    type = Product;
},
    {
    brand = Ryul;
    productTitle = Different;
    quantity = 2;
    subBrand = "Ryul CHES";
    type = SubBrand;
},
    {
    brand = Anan;
    productTitle = Any;
    quantity = 1;
    subBrand = "";
    type = Product;
}
)

Normalmente para ordenar una matriz voy a utilizar

myArray = [uniqueProdsArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

Pero ¿cómo ordenar usando el brand clave del diccionario?

11 Comentarios

  1. 109

    Creo que esto va a hacer:

    brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES];
    sortDescriptors = [NSArray arrayWithObject:brandDescriptor];
    sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];

    Me sacó el código de Tipo De Descriptor De Temas De Programación. También, Clave De Codificación De Valores entra en juego, en el que sortedArrayUsingDescriptors: enviará un valueForKey: a cada elemento en myArray y, a continuación, utilizar el estándar de comparadores para ordenar los valores devueltos.

    • cómo utilizar esta en swift2 ?
  2. 9

    Tenemos La Solución Mediante El Método De La Siguiente Manera

    [self.jsonData sortUsingDescriptors: [NSArray arrayWithObjects: [NSSortDescriptor sortDescriptorWithKey:"fullname" ascending:YES], [NSSortDescriptor sortDescriptorWithKey:"id" ascending:NO], nil]];

    Donde:-

    jsonData – MutableArray Que tiene el Analizar los Datos JSON.

    fullname – los datos que desea ordenar.

    id – Una única de datos que viene con el interior diccionario.

  3. 4
     arrSorted = [arrBrand sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                if ([[obj1 valueForKey:@"iUserId"] integerValue] > [[obj2 valueForKey:@"iUserId"] integerValue]) {
                    return (NSComparisonResult)NSOrderedDescending;
                }
                if ([[obj1 valueForKey:@"iUserId"] integerValue] < [[obj2 valueForKey:@"iUserId"] integerValue]) {
                    return (NSComparisonResult)NSOrderedAscending;
                }
                return (NSComparisonResult)NSOrderedSame;
            }];
    • Mientras sortedArrayUsingComparator es el camino a seguir, tener hasta cuatro llamadas a «valueForKey» en lugar de dos llamadas a «objectForKey» es malo. BTW. Desde que esperar diccionarios, uso NSDictionary* como el tipo, no id.
  4. 4

    En switf:

    var descriptor: NSSortDescriptor = NSSortDescriptor(key: "brand", ascending: true)
    var sortedResults: NSArray = results.sortedArrayUsingDescriptors([descriptor])
  5. 4

    Utilizar el siguiente código para ordenar el uso de la «marca» clave en el diccionario..

    NSSortDescriptor * brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES];
    NSArray * sortDescriptors = [NSArray arrayWithObject:brandDescriptor];
    NSArray * sortedArray = [myArray sortedArrayUsingDescriptors:sortDescriptors];
    NSLog(@"sortedArray %@",sortedArray);

    Utilizar el siguiente código, Si a la clasificación según las dos claves del diccionario; Como, «marca» y productTitle clave en el diccionario:-

    NSSortDescriptor * brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES];
    NSSortDescriptor * productTitleDescriptor = [[NSSortDescriptor alloc] initWithKey:@"productTitle" ascending:YES];
    NSArray * sortDescriptors = [NSArray arrayWithObjects:brandDescriptor, productTitleDescriptor, nil];
    NSArray * sortedArray = [feedData sortedArrayUsingDescriptors:sortDescriptors];
    NSLog(@"sortedArray %@",sortedArray);
  6. 3

    Como una adición a la QED del código,

    NSSortDescriptor * brandDescriptor = [[NSSortDescriptor alloc] initWithKey:@"brand" ascending:YES];
    NSArray * sortedArray = [myArray sortedArrayUsingDescriptors:@[brandDescriptor]];

    Esto aclara las clases de las variables y optimiza la creación de la matriz con la rápida enumeración.
    Gracias

  7. 2

    Mi código se bloquea cuando se utiliza NSSortDescriptor así terminó con un bloque que funciona muy bien en mi caso de uso, donde estoy esperando el «rango» para ser un NSNumber. Si el objeto no puede ser convertida a un número entero no va a ordenar, pero tampoco va a causar un accidente.

    NSArray *sortedArray = [data sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        long data1 = [[obj1 valueForKey:@"rank"] integerValue];
        long data2 = [[obj2 valueForKey:@"rank"] integerValue];
        if (data1 > data2) {
            return (NSComparisonResult)NSOrderedDescending;
        }
        if (data1 < data2) {
            return (NSComparisonResult)NSOrderedAscending;
        }
        return (NSComparisonResult)NSOrderedSame;
    }];
  8. 1
    NSSortDescriptor *brandDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"Position" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:brandDescriptor];
    NSArray  *sortedArray = [arrTemp sortedArrayUsingDescriptors:sortDescriptors];
    array_PreLagData=(NSMutableArray*)sortedArray;
    unsorted array
    Printing description of arrTemp:
    <__NSArrayM 0x10282100>(
    {
    Milker2 = "11:03:17 AM";
    Position = 2;
    },
    {
    Milker1 = "11:03:28 AM";
    Position = 25;
    },
    {
    Milker3 = "11:03:18 AM";
    Position = 3;
    },
    {
    Milker1 = "11:03:16 AM";
    Position = 1;
    Strip = "11:32:32 AM";
    },
    {
    Milker1 = "11:03:21 AM";
    Position = 10;
    }
    )
    Sorted array
    <__NSArrayI 0x101363c0>(
    {
    Milker1 = "11:03:16 AM";
    Position = 1;
    Strip = "11:32:32 AM";
    },
    {
    Milker2 = "11:03:17 AM";
    Position = 2;
    },
    {
    Milker3 = "11:03:18 AM";
    Position = 3;
    },
    {
    Milker1 = "11:03:21 AM";
    Position = 10;
    },
    {
    Milker1 = "11:03:28 AM";
    Position = 25;
    }
    )
    [enter link description here][1]
    [1]: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/SortDescriptors/Articles/Creating.html#//apple_ref/doc/uid/20001845-BAJEAIEE
  9. 1

    usted puede hacer esto .

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"d LLLL yyyy"];
    NSComparator compareDates = ^(id string1, id string2)
    {
    NSDate *date1 = [formatter dateFromString:string1];
    NSDate *date2 = [formatter dateFromString:string2];
    return [date1 compare:date2];
    };
    NSSortDescriptor * sortDesc1 = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO comparator:compareDates];
    [array sortUsingDescriptors:[NSArray arrayWithObjects:sortDesc1, nil]];
  10. 1

    Pruebe manera más fácil…

    myArray = [[NSMutableArray alloc] init];
    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    [tempArray removeAllObjects];
    [tempArray addObjectsFromArray: myArray];
    NSString *key = @"brand";
    NSSortDescriptor *brandDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:brandDescriptor,nil];
    NSArray *sortedArray = [tempArray sortedArrayUsingDescriptors:sortDescriptors];
    [brandDescriptor release];
    [tempArray removeAllObjects];
    tempArray = (NSMutableArray*)sortedArray;
    [myArray removeAllObjects];
    [myArray addObjectsFromArray:tempArray];
  11. 0

    El uso de este para swift 4

    let sortedArray = arrayTobeSort.sorted {$0["keyName"].compare($1["keyName"]) == ComparisonResult.orderedAscending}

    También puede utilizar ComparisonResult.orderedDescending para ordenar en orden descendente

Dejar respuesta

Please enter your comment!
Please enter your name here