2012-04-12 12 views
1

Wie kann ich die folgende Methode verwenden, um mein Array zu sortieren und die die Duplikate zu halten? Alles, was ich will, ist das Sortieren des Distanz-Arrays und das Sortieren des lineItems-Arrays in der gleichen Reihenfolge, so dass meine Werbebuchungen nach Entfernung sortiert sind. Gibt es einen einfachen Weg, dies zu tun? Ich habe viele verschiedene Implementierungen ohne Glück ausprobiert.Wie verhindern Sie, dass sortedArrayUsingSelector doppelte Einträge (ios) entfernt?

lineItems = [[NSMutableArray alloc] initWithArray:(NSMutableArray *)[data objectForKey:@"line_items"]]; 
distanceArray = [[NSMutableArray alloc] initWithCapacity:[lineItems count]]; 
     for (int i = 0; i < [lineItems count]; i++) { 
      CLLocation *spotLocation = [[CLLocation alloc] initWithLatitude:[[[lineItems objectAtIndex:i] objectForKey:@"latitude"] floatValue] longitude:[[[lineItems objectAtIndex:i] objectForKey:@"longitude"] floatValue]]; 
      CLLocationDistance distance = ([myLocation distanceFromLocation:spotLocation]/1000) * 0.621371192; 
      NSNumber *foo = [[NSNumber alloc] initWithDouble:distance]; 
      [distanceArray insertObject:foo atIndex:i]; 
     } 

Meine Blase Art Umsetzung:

for (int i=0;i<[distanceArray count]-1;i++){ 
      for(int j=1;j<[distanceArray count];j++){ 
       if ([[distanceArray objectAtIndex:i]doubleValue] >[[distanceArray objectAtIndex:j]doubleValue]){ 
        NSNumber *temp_i = [[NSNumber alloc] initWithDouble:[[distanceArray objectAtIndex:i]doubleValue]]; 
        NSNumber *temp_j = [[NSNumber alloc] initWithDouble:[[distanceArray objectAtIndex:j]doubleValue]]; 
        [distanceArray removeObjectAtIndex:i]; 
        [distanceArray removeObjectAtIndex:j]; 
        [distanceArray insertObject:temp_j atIndex:i]; 
        [distanceArray insertObject:temp_i atIndex:j]; 

        NSDictionary *tempObj_i = [[NSDictionary alloc] initWithDictionary:[lineItems objectAtIndex:i]]; 
        NSDictionary *tempObj_j = [[NSDictionary alloc] initWithDictionary:[lineItems objectAtIndex:j]]; 
        [lineItems removeObjectAtIndex:i]; 
        [lineItems removeObjectAtIndex:j]; 
        [lineItems insertObject:tempObj_j atIndex:i]; 
        [lineItems insertObject:tempObj_i atIndex:j]; 
       } 
      } 
     } 
+0

Was ist in 'dictionary'? – lnafziger

+0

Inafziger, ich habe mehr von dem Code hinzugefügt –

+0

auf welche Methode beziehen Sie sich? 'sortedArrayUsingSelector:'? – skytz

Antwort

0

Am Ende habe ich nur die lineItems in ein Array von änderbaren Wörterbüchern umgewandelt und den Abstand in jede Zeile eingefügt. Verwenden Sie dann die sortUsingDescriptor-Methode. Ich schätze die Hilfe von allen! Etwas so einfaches war so schwer für mich ... danke:

for (int i = 0; i < [lineItems count]; i++) { 
      CLLocation *spotLocation = [[CLLocation alloc] initWithLatitude:[[[lineItems objectAtIndex:i] objectForKey:@"latitude"] floatValue] longitude:[[[lineItems objectAtIndex:i] objectForKey:@"longitude"] floatValue]]; 
      CLLocationDistance distance = ([myLocation distanceFromLocation:spotLocation]/1000) * 0.621371192; 
      NSNumber *foo = [[NSNumber alloc] initWithDouble:distance]; 

      NSMutableDictionary *newLineItem = [[lineItems objectAtIndex:i] mutableCopy]; 
      [newLineItem setObject:foo forKey:@"distance"]; 
      [lineItems removeObjectAtIndex:i]; 
      [lineItems insertObject:newLineItem atIndex:i]; 
      newLineItem = nil; 
     } 
     [lineItems sortUsingDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES]]]; 
+0

Dieser Code ist undicht (es sei denn, Sie verwenden ARC). Sie möchten 'newLineItem' am Ende der Schleife explizit freigeben. Wenn Sie es auf "nil" setzen, wird nur der Verweis auf das 'NSMutableDictionary' verloren, das von' -mutableCopy' zugewiesen wurde. –

+0

Ich benutze ARC, danke für die Köpfe hoch –

0

warum nicht einfach tun, eine alte Mode Blase Art?

etwas wie folgt aus:

distanceArray=[NSMutableArray arrayWithOjects:[ distanceArray allKeys]]; 
for (int i=0;i<[distanceArray count]-1;i++){ 
    for(int j=1;j<[distanceArray count];j++){ 
     if ([[distanceArray objectAtIndex:i]floatValue] >[[distanceArray objectAtIndex:j]floatValue]){ 
      id temp=[[distanceArray objectAtIndex:i]floatValue]; 
      [distanceArray insertObject:[[distanceArray objectAtIndex:j]floatValue] atIndex:i]; 
      [distanceArray insertObject:temp atIndex:j]; 
     } 
    } 
} 

und sie sind alle mit Duplikate sortiert (es nicht schön ist, aber es funktioniert)

edit:

wenn nichts works..make ein Ziel c Objekt mit etwas wie: Koord1, Koord2, Abstand, und vielleicht eine eindeutige ID .. So haben Sie nie ein doppeltes Element. Deklarieren Sie sie als Eigenschaft für das Objekt und dann Blase sortieren sie (mit vielleicht auch die ID-s ändern) wenn Sie ein Objekt mit id = 2 haben und Sie es in Array auf inde verschieben x 1, dann ändere die ID, um mit dem Index übereinzustimmen ... oder etwas zu diesem Zweck. Dann brauchst du das Wörterbuch nicht, denn du hast die Koordinate im Objekt selbst ... es sollte einfacher sein ... zumindest in meinem dagegen

+0

versuchte diese Blasensortierung und erhielt eine Endlosschleife, bis ich die Objekte entfernte, bevor ich sie tauschte. Dies sortiert jedoch immer noch die Nummern in der Reihenfolge. Ich habe meine Implementierung Ihrer Blasensorte in der obigen Beschreibung hinzugefügt. Irgendwelche Hinweise darauf, was schief läuft? –

+0

Mein Ziel ist sehr einfach, ich möchte das Entfernungs-Array sortieren und Werbebuchungen genau so sortieren lassen, dass meine Werbebuchungen nach Entfernung sortiert sind. Aus irgendeinem Grund war das für mich in IOS sehr schwierig ... –

+0

Was machst du mit dem Wörterbuch? Wenn ich das genau verstehe, versuchen Sie in einem Wörterbuch zu speichern, wo der Schlüssel ein Wert ist und das Objekt ein anderer Wert ist.Das ist falsch! Dictionary überschreibt den vorherigen Wert für einen bestimmten Schlüssel ... so verwenden Sie stattdessen entweder 2 Arrays oder schauen Sie in NSSet (das NSSet ist eine Unterklasse von NSArray..so..yea...same Sache) – skytz

1

Statt der Verwendung Ihrer Sortierfunktion, dies versuchen:

[distanceArray sortArrayUsingSelector:@selector(compare:)]; 

Dann brauchen Sie nicht das Wörterbuch überhaupt.

3

Ihr Problem ist nicht -sortedArrayUsingSelector:, es ist NSDictionary 's -allKeys Methode. Schlüssel sind in einem Wörterbuch eindeutig, so dass das Array -allKeys keine Duplikate enthält.

Verwenden Sie eine separate NSArray Instanz, um das Ergebnis der Sortierung zu speichern, oder verwenden Sie den Vorschlag von inafziger.

Verwandte Themen