在iPhone SDK数组排序(Sorting Array in iphone SDK)

2019-08-17 07:32发布

在我的应用程序,我有两个数组名listofeventsarr_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]];
}

问题

但我的问题是,当两个距离都相同和地点名称是不同的话,就说明我的只有第一地点名称两次。

我没有找到我的问题。 帮我解决这个问题

Answer 1:

你可以试试下面的代码。 我稍微修改了我前面的解决方案,以避免字典的使用。 字典的早先提出的建议是基于纯粹的假设,关键是独特的这是不是现在的情况看来。 所以,你可以试试这个:

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);


Answer 2:

您正在使用的距离作为键,但每个键必须是唯一的。 当你有相同的距离,后面的对象的关键将覆盖第一。

我的事情最好的解决办法是创建一个自定义的类,保存每个条目,你还可以添加一个属性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;
    }
];

另一种选择是有名字是在字典中的关键。



Answer 3:

问题是很简单的。 在字典中的每个键应该是唯一的。 你的情况不是这样的。

你的钥匙:54985.5455和54985.5455,都是一样的。 这就是为什么问题时。 更改其中的一个,它会工作就像一个魅力。



Answer 4:

您可以根据您的结果进行搜索。 我发现苹果以下

-(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 */


文章来源: Sorting Array in iphone SDK