-1

私のアプリには、2つの配列名listofeventsとがありarr_Distanceます。

イベントのリストは次のようになります。

(
    {
        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応答で指定された緯度と経度に従って距離を計算しました。ここでは、距離の昇順でリストを表示したいので、次のコードに従って2つの配列を並べ替えました

ソート用

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]];
}

問題

しかし、私の問題は、2つの距離が同じで、会場名が異なる場合、最初の会場名が2回しか表示されないことです。

問題は見つかりませんでした。この問題を解決するのを手伝ってください

4

4 に答える 4

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);
于 2013-03-04T08:37:43.570 に答える
1

距離をキーとして使用していますが、各キーは一意である必要があります。距離が同じであるため、キーに対する後のオブジェクトが最初のオブジェクトを上書きします。

最善の解決策は、各エントリを保持するカスタムクラスを作成することです。これにより、プロパティ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;
    }
];

別のオプションは、名前を辞書のキーにすることです。

于 2013-03-04T05:15:40.480 に答える
0

問題は非常に簡単です。辞書では、各キーは一意である必要があります。あなたの場合はそうではありません。

キー:54985.5455と54985.5455、どちらも同じです。そのため、問題が発生します。それらの1つを変更すると、チャームのように機能します。

于 2013-03-04T05:14:52.910 に答える
0

結果に応じて検索できます。アップルからフォローしているのを見つけました

-(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 */
于 2014-05-06T07:27:11.467 に答える