J'ai un tableau d'objets CLLocation et j'aimerais pouvoir les comparer pour obtenir la distance d'un objet CLLocation de départ. Les calculs sont simples, mais je suis curieux de savoir s'il existe un descripteur de tri pratique pour ce faire? Dois-je éviter NSSortDescriptor et écrire une méthode de comparaison personnalisée + tri à bulles? Je compare habituellement au plus 20 objets, il n'a donc pas besoin d'être super efficace.NSSortDescriptor pour comparer des objets CLLocation dans Cocoa/iPhone
Répondre
Vous pouvez écrire une simple classe compareToLocation: pour CLLocation qui renvoie NSOrderedAscending, NSOrderedDescending ou NSOrderedSame en fonction des distances entre self et l'autre objet CLLocation. Ensuite, il suffit de faire quelque chose comme ceci:
NSArray * mySortedDistances = [myDistancesArray sortedArrayUsingSelector:@selector(compareToLocation:)];
Edit:
Comme ceci:
//CLLocation+DistanceComparison.h
static CLLocation * referenceLocation;
@interface CLLocation (DistanceComparison)
- (NSComparisonResult) compareToLocation:(CLLocation *)other;
@end
//CLLocation+DistanceComparison.m
@implementation CLLocation (DistanceComparison)
- (NSComparisonResult) compareToLocation:(CLLocation *)other {
CLLocationDistance thisDistance = [self distanceFromLocation:referenceLocation];
CLLocationDistance thatDistance = [other distanceFromLocation:referenceLocation];
if (thisDistance < thatDistance) { return NSOrderedAscending; }
if (thisDistance > thatDistance) { return NSOrderedDescending; }
return NSOrderedSame;
}
@end
//somewhere else in your code
#import CLLocation+DistanceComparison.h
- (void) someMethod {
//this is your array of CLLocations
NSArray * distances = ...;
referenceLocation = myStartingCLLocation;
NSArray * mySortedDistances = [distances sortedArrayUsingSelector:@selector(compareToLocation:)];
referenceLocation = nil;
}
Juste pour ajouter à la réponse de la catégorie (ce qui est le chemin à parcourir), ne pas oublier vous n'avez pas réellement besoin de faire des calculs vous-même, vous pouvez utiliser la méthode d'instance CLLocation:
- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location
Pour obtenir la dis entre deux objets de localisation.
Pour améliorer la réponse de Dave ...
Comme d'iOS 4, vous pouvez utiliser un bloc comparateur et éviter d'avoir à utiliser une variable statique et catégorie:
NSArray *sortedLocations = [self.locations sortedArrayUsingComparator:^NSComparisonResult(CLLocation *obj1, CLLocation *obj2) {
CLLocationDistance distance1 = [targetLocation distanceFromLocation:loc1];
CLLocationDistance distance2 = [targetLocation distanceFromLocation:loc2];
if (distance1 < distance2)
{
return NSOrderedAscending;
}
else if (distance1 > distance2)
{
return NSOrderedDescending;
}
else
{
return NSOrderedSame;
}
}];
Je pense que ce devrait être "obj1", "obj2, au lieu de" loc1 "," loc2 "dans la distance de l'emplacement. – Pochi
- 1. Scala: comparer des objets frais
- 2. Comparer 2 objets personnalisés - C#
- 3. NSSortDescriptor et to-many relations
- 4. java comparer des objets: en utilisant la réflexion?
- 5. Comment trier NSNumber avec NSSortDescriptor?
- 6. Stocker une CLLocation persistante
- 7. coordonnées Changement de CLLocation
- 8. C++: surcharge de <pour des pointeurs vers des objets
- 9. Comparer deux objets avec une vérification de null
- 10. Conception pour convertir des objets
- 11. Custom List Comparer des dates dans Sharepoint
- 12. Comparer des phrases (chaînes) dans AS3
- 13. Comment comparer si deux objets sont vraiment le même objet?
- 14. XSL, comparer des dates pour exclure des événements passés
- 15. Comment comparer et supprimer des objets d'un ensemble <E> basé sur la condition
- 16. Comment utiliser pour un HashSet Comparer
- 17. Cloner des objets dans VBA?
- 18. Renommer des objets dans PowerPoint
- 19. Dictionnaire Python pour stocker des objets socket
- 20. Linq - quelle locale/collation utilise-t-elle pour comparer les objets?
- 21. Obtenir des objets pour rester dans une droppable scriptaculous
- 22. Algorithmes pour positionner des objets dans un canevas
- 23. Dois-je stocker des objets entiers ou des pointeurs sur des objets dans des conteneurs?
- 24. Algorithmes pour l'espacement visuel des objets
- 25. Dois-je utiliser Calendar.compareTo() pour comparer des dates?
- 26. Comment comparer dans RDLC
- 27. Comment comparer la taille des exécutables dans VB6?
- 28. Affichage des objets associés
- 29. Pourquoi ma vitesse de CLLocation est-elle si inexacte?
- 30. Exposer des objets métier existants dans WCF
Pouvez-vous donner un exemple de ce? –
@Kevin - J'ai édité le message pour inclure un exemple –
J'ai essayé de l'implémenter exactement comme vous l'avez ici. La variable statique est toujours nulle et ne peut donc pas être triée. Est-ce que je manque quelque chose? –