1324 Stimmen

Wie kann ich ein NSMutableArray mit benutzerdefinierten Objekten darin sortieren?

Was ich tun möchte, scheint ziemlich einfach zu sein, aber ich kann keine Antworten im Internet finden. Ich habe eine NSMutableArray von Objekten, und sagen wir, es sind 'Person'-Objekte. Ich möchte die NSMutableArray durch Person.birthDate, das eine NSDate .

Ich glaube, es hat etwas mit dieser Methode zu tun:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

In Java würde ich dafür sorgen, dass mein Objekt Comparable implementiert, oder Collections.sort mit einem benutzerdefinierten Inline-Vergleicher verwenden... wie um alles in der Welt machen Sie das in Objective-C?

9voto

MD Aslam Ansari Punkte 1517

Sie können die folgende allgemeine Methode für Ihren Zweck verwenden. Sie sollte Ihr Problem lösen.

//Called method
-(NSMutableArray*)sortArrayList:(NSMutableArray*)arrDeviceList filterKeyName:(NSString*)sortKeyName ascending:(BOOL)isAscending{
    NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:sortKeyName ascending:isAscending];
    [arrDeviceList sortUsingDescriptors:[NSArray arrayWithObject:sorter]];
    return arrDeviceList;
}

//Calling method
[self sortArrayList:arrSomeList filterKeyName:@"anything like date,name etc" ascending:YES];

8voto

Arvind Patel Punkte 334

Sie verwenden NSSortDescriptor, um ein NSMutableArray mit benutzerdefinierten Objekten zu sortieren

 NSSortDescriptor *sortingDescriptor;
 sortingDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthDate"
                                       ascending:YES];
 NSArray *sortArray = [drinkDetails sortedArrayUsingDescriptors:@[sortDescriptor]];

8voto

Dinesh_ Punkte 249

Wenn Sie nur ein Array von NSNumbers können Sie sie mit 1 Anruf sortieren:

[arrayToSort sortUsingSelector: @selector(compare:)];

Das funktioniert, weil die Objekte in dem Array ( NSNumber Objekte) implementieren die Vergleichsmethode. Das Gleiche könnte man für NSString Objekte oder sogar für ein Array von benutzerdefinierten Datenobjekten, die eine Vergleichsmethode implementieren.

Hier ist ein Beispielcode mit Komparatorblöcken. Er sortiert ein Array von Wörterbüchern, wobei jedes Wörterbuch eine Zahl in einem Schlüssel "sort_key" enthält.

#define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
 ^(id obj1, id obj2) 
  {
  NSInteger value1 = [[obj1 objectForKey: SORT_KEY] intValue];
  NSInteger value2 = [[obj2 objectForKey: SORT_KEY] intValue];
  if (value1 > value2) 
{
  return (NSComparisonResult)NSOrderedDescending;
  }

  if (value1 < value2) 
{
  return (NSComparisonResult)NSOrderedAscending;
  }
    return (NSComparisonResult)NSOrderedSame;
 }];

Der obige Code veranschaulicht, wie man einen ganzzahligen Wert für jeden Sortierschlüssel erhält und diese vergleicht. Da NSNumber Objekte eine Vergleichsmethode implementieren, könnte sie viel einfacher umgeschrieben werden:

 #define SORT_KEY @\"sort_key\"

[anArray sortUsingComparator: 
^(id obj1, id obj2) 
 {
  NSNumber* key1 = [obj1 objectForKey: SORT_KEY];
  NSNumber* key2 = [obj2 objectForKey: SORT_KEY];
  return [key1 compare: key2];
 }];

oder der Körper des Komparators könnte sogar auf 1 Zeile reduziert werden:

  return [[obj1 objectForKey: SORT_KEY] compare: [obj2 objectForKey: SORT_KEY]];

Ich neige dazu, einfache Anweisungen und viele temporäre Variablen zu bevorzugen, weil der Code leichter zu lesen und einfacher zu debuggen ist. Der Compiler optimiert die temporären Variablen ohnehin weg, so dass die Ein-Zeilen-Version keinen Vorteil bietet.

7voto

Emile Khattar Punkte 359
-(NSMutableArray*) sortArray:(NSMutableArray *)toBeSorted 
{
  NSArray *sortedArray;
  sortedArray = [toBeSorted sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
  {
    return [a compare:b];
 }];
 return [sortedArray mutableCopy];
}

7voto

Boobalan Punkte 765

Ich habe gerade eine mehrstufige Sortierung auf der Grundlage einer benutzerdefinierten Anforderung vorgenommen.

//Sortierung der Werte

    [arrItem sortUsingComparator:^NSComparisonResult (id a, id b){

    ItemDetail * itemA = (ItemDetail*)a;
    ItemDetail* itemB =(ItemDetail*)b;

    //item price are same
    if (itemA.m_price.m_selling== itemB.m_price.m_selling) {

        NSComparisonResult result=  [itemA.m_itemName compare:itemB.m_itemName];

        //if item names are same, then monogramminginfo has to come before the non monograme item
        if (result==NSOrderedSame) {

            if (itemA.m_monogrammingInfo) {
                return NSOrderedAscending;
            }else{
                return NSOrderedDescending;
            }
        }
        return result;
    }

    //asscending order
    return itemA.m_price.m_selling > itemB.m_price.m_selling;
}];

https://sites.google.com/site/greateindiaclub/mobil-apps/ios/multilevelsortinginiosobjectivec

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X