2016-04-20 5 views
0

Ich habe ein Array von Koordinaten, die Strings sind. Ein String ist also eine Koordinate mit dem Lat und ist durch ein Komma getrennt.Entfernen Sie doppelte Koordinaten von NSMutableArray

Zum Beispiel: 47.551170,18.961630

Also meine Array wie folgt aussieht:

47.551090,18.961610 
47.551010,18.961600 
47.550910,18.961600 
47.550830,18.961610 
47.550750,18.961640 
47.550690,18.961680 
47.549980,18.962870 
47.549170,18.964170 
47.548950,18.964500 
47.548840,18.964620 
47.548710,18.964690 
47.548470,18.964690 
47.548400,18.964690 
47.547990,18.964720 

Wie kann ich löschen eine Koordinate, wenn sie entweder lat oder lange Streichhölzer ein anderes ist die Koordinate lat oder lange in der Anordnung?

Antwort

0
NSArray *Array1 = @[@"47.551090,18.961610", 
          @"47.551010,18.961600", 
          @"47.550910,18.961600", 
          @"47.550830,18.961610", 
          @"47.550750,18.961640", 
          @"47.550690,18.961680", 
          @"47.549980,18.962870", 
          @"47.549170,18.964170", 
          @"47.548950,18.964500", 
          @"47.548840,18.964620", 
          @"47.548710,18.964690", 
          @"47.548470,18.964690", 
          @"47.548400,18.964690", 
          @"47.547990,18.964720"]; 

NSMutableArray *finalArr=[[NSMutableArray alloc] init]; 
for (NSString *str in Array1) { 
    NSArray *temp=[str componentsSeparatedByString:@","]; 
    if(temp!=nil && [temp count]==2){ 
     BOOL isSame=NO; 
     for(NSString *s in finalArr){ 
      NSArray *temp2=[s componentsSeparatedByString:@","]; 
      if([[temp objectAtIndex:0] isEqualToString:[temp2 objectAtIndex:0]]){ 
       isSame=YES; 
       break; 
      } 

      if([[temp objectAtIndex:1] isEqualToString:[temp2 objectAtIndex:1]]){ 
       isSame=YES; 
       break; 
      } 
     } 

     if(isSame==NO){ 
      [finalArr addObject:str]; 
     } 
    } 
} 
NSLog(@"%@",finalArr); 
+0

Perfekt, danke! –

0

Sie möchten diese Zeichenfolgen in CLLocationCoordinate2D Objekte konvertieren, so dass Sie Werte anstelle von Zeichenfolgen vergleichen können. Wenn Sie eine == Überschreibung bereitzustellen, dann können Sie Swifts contains Methode verwenden, um leicht eine Reihe von einzigartigen Koordinaten zu erstellen wie folgt:

var coordinates: [CLLocationCoordinate2D] = [] 
for string in stringArray { 
    let coordinateStrings = string.componentsSeparatedByString(",") 
    let coordinate = CLLocationCoordinate2D(latitude: Double(coordinateStrings[0])!, longitude: Double(coordinateStrings[1])!) 
    coordinates.append(coordinate) 
} 

func ==(lhs: CLLocationCoordinate2D, rhs: CLLocationCoordinate2D) -> Bool { 
    //If you really do mean lat OR long, then change the && to || 
    return lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude 
} 

var uniqueCoordinates: [CLLocationCoordinate2D] = [] 
for coordinate in coordinates { 
    if !uniqueCoordinates.contains(coordinate) { 
     uniqueCoordinates.append(coordinate) 
    } 
} 

Dann, wenn Sie diese Koordinaten zurück in Strings konvertieren möchten, können Sie dies tun:

var uniqueStrings: [String] = [] 
for coordinate in uniqueCoordinates { 
    let uniqueString = String(format: "%f,%f", coordinate.latitude,coordinate.longitude) 
    uniqueStrings.append(uniqueString) 
} 
+0

Wie auch immer Sie das in Obj-C schreiben könnten? Und ja, ich meine lat und lang, ich weiß, wie man zwei Koordinatoren vergleicht, um zu sehen, ob sie übereinstimmen. Was ich wissen muss, ist, wie man ihre Lat- oder Long-Werte vergleicht, so dass kein einzelner Lat-Wert mit einem anderen Lat-Wert oder Long-Wert im Array übereinstimmt. –

0

Seine ziemlich einfache Verwendung NSOrderedSet, NSMutableSet oder NSSet, die nur unterschiedliche Werte speichern ist, wird es automatisch ignoriert doppelte Werte.

Die NSMutableSet-Klasse deklariert die programmatische Schnittstelle für eine veränderbare, ungeordnete Auflistung von unterschiedlichen Objekten.

NSOrderedSet und seine Unterklasse NSMutableOrderedSet deklarieren die programmatischen Schnittstellen für eine geordnete Auflistung von Objekten.

Lesen Sie mehr in Apple Documentation about NSMutableSet und NSOrderedSet Class Reference

NSOrderedSet *uniqueSet = [NSOrderedSet setWithObjects:@"47.551090,18.961610", 
@"47.551010,18.961600", 
@"47.550910,18.961600", 
@"47.550830,18.961610", 
@"47.550750,18.961640", 
@"47.550690,18.961680", 
@"47.549980,18.962870", 
@"47.549170,18.964170", 
@"47.548950,18.964500", 
@"47.548840,18.964620", 
@"47.548710,18.964690", 
@"47.548470,18.964690", 
@"47.548400,18.964690", 
@"47.547990,18.964720", nil]; 

NSLog(@"Unique List : %@",uniqueSet); 

es überprüfen, indem Sie alle Wert mehrfach Hinzufügen es nur einmal zeigen, wenn Sie sich anmelden.

Glücklich Codierung :)

+0

Das Problem mit NSSet ist, dass die Koordinaten in der gleichen Reihenfolge bleiben sollten, NSSet ist leider ungeordnet. –

+0

Es gibt auch eine Lösung verwenden 'NSOrderedSet', die Ordnung hält. Weitere Informationen zu [it in NSOrderedSet Class Reference] (https://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjYycHkkJ_MAhUEn5QKHd4VAgkQFgbbMAA&url=https%3A%2F % 2Fentwickler.apple.com% 2Flibrary% 2Fmac% 2FDokumentation% 2FFoundation% 2FReference% 2FNSOrderedSet_Class% 2F & usg = AFQjCNF7351-ZZ4pyEKhAiFHrx5FuFfAZg & bvm = bv.119967911, d.dGo) –

+0

Das würde nur helfen zu überprüfen, ob einige der Koordinaten Duplikate haben, aber nicht die Lats oder Longs einzeln –

1

versuchen, dies mit NSMutableSet: -

NSMutableArray *Array1 = @[@"47.551090,18.961610", 
@"47.551010,18.961600", 
@"47.550910,18.961600", 
@"47.550830,18.961610", 
@"47.550750,18.961640", 
@"47.550690,18.961680", 
@"47.549980,18.962870", 
@"47.549170,18.964170", 
@"47.548950,18.964500", 
@"47.548840,18.964620", 
@"47.548710,18.964690", 
@"47.548470,18.964690", 
@"47.548400,18.964690", 
@"47.547990,18.964720", nil]; 

NSMutableSet *uniqueMakes = [NSMutableSet setWithArray:Array1]; 

Wenn Sie nun das uniqueMakes Drucken NSLog mit Dann drucken Sie es nur diejenigen, die danach nicht wiederholt einzigartig u diese Werte zeigen auf der MapView. Wenn Sie mehr über NSSet erfahren möchten, gehen Sie auf diesen Link http://rypress.com/tutorials/objective-c/data-types/nsset.

+0

Das Problem mit NSSet ist, dass die Koordinaten in der gleichen Reihenfolge bleiben sollen, NSSet ist leider ungeordnet. –

+0

Sie können nsset Objekte mit diesem [mySet sortedArrayUsingDescriptors: descriptors]; , NSSortDescriptor ist Deskriptoren –

+0

@ BalázsVincze Wie wäre es mit NSOrderedSet? –