1

私は2つの配列を持っており、どちらも次のようなNSStringオブジェクトでいっぱいです。

NSMutableArray *titles = [[NSMutableArray alloc] initWithObjects:@"Title1", @"Title2", @"Title3", @"Title4", @"Title5", nil];

NSMutableArray *distances = [[NSMutableArray alloc] initWithObjects:@"139.45", @"23.78", @"347.82", @"10.29", @"8.29", nil];

最初に両方の配列を最も近い距離で並べ替えるにはどうすればよいですか?

したがって、結果は次のようになります。

titles = @"Title5", @"Title4", @"Title2", @"Title1", @"Title3"
distances = @"8.29", @"10.29", @"23.78", @"139.45", @"347.82"

NSSortDescriptorはこのような状況で使用できることを理解していますが、ドキュメントを確認した後でも、その方法がわかりません。

4

4 に答える 4

1

NSComparatorブロックを使用して、NSArrayのsortedArrayUsingComparatorメソッドを使用できます。そのブロックで、比較する2つのオブジェクトを受け取り、比較結果に基づいて、NSMutableArray exchangeObjectAtIndex:withObjectAtIndex:メソッドを使用してタイトルの値を変更できます。

于 2012-10-02T16:16:26.450 に答える
1

このように距離を並べ替えます...

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];

NSArray *sortedDistances = [listItem sortedArrayUsingComparator: ^(id a, id b) {
    NSNumber *aNum = [f numberFromString:a];
    NSNumber *bNum = [f numberFromString:b];
    return [aNum compare:bNum];
}];

関連するタイトルを並べ替える特に簡単な方法は考えられませんが、これでうまくいくはずです...

NSMutableArray *sortedTitles = [NSMutableArray array];
NSDictionary *distanceTitle = [NSDictionary dictionaryWithObjects:titles forKeys:distances];

for (NSString *distance in sortedDistances) {
    NSString *associatedTitle = [distanceTitle valueForKey:distance];
    [sortedTitles addObject:associatedTitle];
}
于 2012-10-02T16:27:09.503 に答える
0

距離値で辞書の配列を並べ替える方法の例を次に示します。

    -(void)reorderByDistance {
    NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
    self.contentArray = [self.contentArray sortedArrayUsingDescriptors:sortDescriptors];
}

そして私の辞書は次のようになります:

    NSDictionary *dict1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"1", @"id", @"Business #1", @"name", @"This business does some pretty remarkable things", @"description", @"Alley Bar", @"category", @"1.2", @"distance", nil];
于 2012-10-02T16:16:00.317 に答える
0

1つのアプローチは、タイトルを距離にマッピングする辞書を作成し、距離を並べ替えてから、距離を反復処理してタイトルを再作成することです。

NSMutableArray *titles = [[NSMutableArray alloc] initWithObjects:@"Title1", @"Title2", @"Title3", @"Title4", @"Title5", nil];

NSMutableArray *distances = [[NSMutableArray alloc] initWithObjects:@"139.45", @"23.78", @"347.82", @"10.29", @"8.29", nil];

//Create a map of current titles to distances
NSDictionary *titleDistanceMap = [NSDictionary dictionaryWithObjects:titles forKeys:distances];

//Need to sort the strings as numerical values
[distances sortUsingComparator:^(NSString *obj1, NSString *obj2) {

    return [obj1 compare:obj2 options:NSNumericSearch];
}];

//Now re-populate the titles array
[titles removeAllObjects];

for (NSString *distance in distances){
    [titles addObject:[titleDistanceMap objectForKey:distance]];
}
于 2012-10-02T16:56:56.523 に答える