在我的应用程序,我有两个数组名listofevents
& arr_Distance
。
Listofevents看起来像以下:
(
{
Latitude = "34.1356031";
Longitude = "-118.0312634";
VenueName = "Fantasia Billiard";
}, {
Latitude = "34.1356031";
Longitude = "-118.0312634";
VenueName = "Dave & Busters";
}
)
arr_distace样子
( 54985.5455,54985.5455 )
我计算距离按经纬度在JSON响应中给出。 在这里,我想表现出距离增加的顺序列表,所以我整理两个阵列按下面的代码
对于排序
NSDictionary *dict = [NSDictionary dictionaryWithObjects:listOfEvents forKeys:arr_distance];
sortedArray = [arr_distance sortedArrayUsingComparator:^(id firstObject, id secondObject) {
return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch];
}];
sortedValues = [NSMutableArray array];
for (NSString *key in sortedArray) {
[sortedValues addObject:[dict valueForKey:key]];
}
问题
但我的问题是,当两个距离都相同和地点名称是不同的话,就说明我的只有第一地点名称两次。
我没有找到我的问题。 帮我解决这个问题
你可以试试下面的代码。 我稍微修改了我前面的解决方案,以避免字典的使用。 字典的早先提出的建议是基于纯粹的假设,关键是独特的这是不是现在的情况看来。 所以,你可以试试这个:
NSArray *a = @[@"353.90", @"354.68", @"354.68", @"1.18"];
NSArray *b = @[@{ @"Contestant1":@"Jon jones1",
@"Contestant2":@"Anderson silva1"},
@{ @"Contestant1":@"Jon jones2",
@"Contestant2":@"Anderson silva2"},
@{ @"Contestant1":@"Jon jones3",
@"Contestant2":@"Anderson silva3"},
@{ @"Contestant1":@"Jon jones4",
@"Contestant2":@"Anderson silva4"}];
NSArray *sortedArray = [a sortedArrayUsingComparator:^(id firstObject, id secondObject) {
return [((NSString *)firstObject) compare:((NSString *)secondObject) options:NSNumericSearch];
}];
NSArray *sortedValues = [b sortedArrayUsingComparator:^(id firstObject, id secondObject) {
id obj1 = [a objectAtIndex:[b indexOfObject:firstObject]];
id obj2 = [a objectAtIndex:[b indexOfObject:secondObject]];
return [((NSString *)obj1) compare:((NSString *)obj2) options:NSNumericSearch];
}];
NSLog(@"%@",sortedArray);
NSLog(@"%@",sortedValues);
您正在使用的距离作为键,但每个键必须是唯一的。 当你有相同的距离,后面的对象的关键将覆盖第一。
我的事情最好的解决办法是创建一个自定义的类,保存每个条目,你还可以添加一个属性distance
和排序了。
@interface Entry : NSObject
@property (strong) NSString *longitude
@property (strong) NSString *latitude
@property (strong) NSString *name
@property double distance;
@end
做
NSMutableArray *listOfEntries = [NSMutableArray array];
[listofevents enumerateObjectsUsingBlock:^(NSDictionary *dict, NSUInteger idx, BOOL *stop) {
Entry *entry = [[Entry alloc] init];
entry.latitude = [dict objectForKey:@"Latitude"];
entry.longitude = [dict objectForKey:@"Longitude"];
entry.name = [dict objectForKey:@"VenueName"];
entry.distance = DistanceBetweenPoints(currentLocation, CGPointMake(entry.latitude,entry.longitude));
[listOfEntries addObject:entry];
}];
[listOfEntries sortUsingComparator:
^NSComparisonResult(Entry *obj1, Entry *obj2){
return obj1.distance > obj2.distance;
}
];
另一种选择是有名字是在字典中的关键。
问题是很简单的。 在字典中的每个键应该是唯一的。 你的情况不是这样的。
你的钥匙:54985.5455和54985.5455,都是一样的。 这就是为什么问题时。 更改其中的一个,它会工作就像一个魅力。
您可以根据您的结果进行搜索。 我发现苹果以下
-(NSArray*)SortingArray:(NSMutableArray*)unSortedArray
{
static NSStringCompareOptions compareOption=NSCaseInsensitiveSearch |NSNumericSearch|NSWidthInsensitiveSearch|NSForcedOrderingSearch;
NSLocale *locale=[NSLocale currentLocale];
NSComparator comparatorBlock=^(id string1, id string2)
{
NSRange string1Range=NSMakeRange(0,[string1 length]);
return [string1 compare:string2 options:compareOption range:string1Range locale:locale];
};
NSArray *sortedArray=[unSortedArray sortedArrayUsingComparator:comparatorBlock ];
return sortedArray;
}
您可以使用字符串比较选项。 有限制的搜索,我发现了更多的选择
NSCaseInsensitiveSearch = 1,
NSLiteralSearch = 2, /* Exact character-by-character equivalence */
NSBackwardsSearch = 4, /* Search from end of source string */
NSAnchoredSearch = 8, /* Search is limited to start (or end, if NSBackwardsSearch) of source string */
NSNumericSearch = 64, /* Added in 10.2; Numbers within strings are compared using numeric value, that is, Foo2.txt < Foo7.txt < Foo25.txt; only applies to compare methods, not find */
NSDiacriticInsensitiveSearch /* If specified, ignores diacritics (o-umlaut == o) */
NSWidthInsensitiveSearch /* If specified, ignores width differences ('a' == UFF41) */
NSForcedOrderingSearch /* If specified, comparisons are forced to return either NSOrderedAscending or NSOrderedDescending if the strings are equivalent but not strictly equal, for stability when sorting (e.g. "aaa" > "AAA" with NSCaseInsensitiveSearch specified) */
NSRegularExpressionSearch /* Applies to rangeOfString:..., stringByReplacingOccurrencesOfString:..., and replaceOccurrencesOfString:... methods only; the search string is treated as an ICU-compatible regular expression; if set, no other options can apply except NSCaseInsensitiveSearch and NSAnchoredSearch */