使用Block sortedArrayUsingComparator:^(id a,id b)

时间:2013-09-20 23:22:58

标签: ios objective-c block objective-c-blocks sorteddictionary

在我的项目中,我尝试使用block sortedArrayUsingComparator将已知位置与输入位置进行比较:^(id a,id b)。我有一个名为locationArray的字典数组,其中包含一个lat long和一个与该lat长点对应的站号。我尝试将每个locationArray站与输入的站进行比较。我这样做是通过取两个差值的绝对值来得到一个距离。然后我尝试根据输入站距离最近到最远的距离对locationArray进行排序。

//locationArray

#define kStation @"station"
#define kLatitude @"latitude"
#define kLongitude @"longitude"




NSString *filePath = [[NSBundle mainBundle] pathForResource:@"499CSV" ofType:@"csv"];
NSString *csvString = [NSString stringWithContentsOfFile:filePath  encoding:NSUTF8StringEncoding error:nil];

NSArray *locations = [csvString componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

NSMutableArray *CSVArray = [NSMutableArray array];


NSCharacterSet *whiteSPNewLine = [NSCharacterSet whitespaceAndNewlineCharacterSet];
for (NSString * location in locations)
{

NSArray *components = [location componentsSeparatedByString:@","];

double latitude   = [[components[0] stringByTrimmingCharactersInSet:whiteSPNewLine] doubleValue];
double longitude  = [[components[1] stringByTrimmingCharactersInSet:whiteSPNewLine] doubleValue];
NSString *station = [components[2] stringByTrimmingCharactersInSet:whiteSPNewLine];

NSDictionary *dict = @{kLatitude: @(latitude),
                       kLongitude: @(longitude),
                       kStation: station};

[CSVArray addObject:dict];

}

NSLog(@"The contents of CSVArray = %@",[CSVArray description]);


{
    latitude = "41.674364";
    longitude = "-81.23700700000001";
    station = 40150;
},
    {
    latitude = "41.67517";
    longitude = "-81.235038";
    station = 40763;
},
    {
    latitude = "41.673106";
    longitude = "-81.24017499999999";
    station = 39175;
}, ...

我的块代码直接跟随locationArray。

NSArray *orderedPlaces = [CSVArray sortedArrayUsingComparator:^(id a, id b) {

NSDictionary *dictA;
NSDictionary *dictB;

NSString *locA;
NSString *locB;

int distanceA;
int distanceB;


dictA = (NSDictionary *)a;
dictB = (NSDictionary *)b;

NSLog(@"dictA = %@", dictA);
NSLog(@"dictB = %@", dictB);


locA = [dictA objectForKey:kStation];
locB = [dictB objectForKey:kStation];

NSLog(@"locA = %@", locA);
NSLog(@"locB = %@", locB);



distanceA = abs(stationNumber-[locA intValue]);
distanceB = abs(stationNumber-[locB intValue]);

NSLog(@"distanceA = %d", distanceA);
NSLog(@"distanceB = %d", distanceB);

if (distanceA < distanceB) {
  return NSOrderedAscending;
} else if (distanceA > distanceB) {
  return NSOrderedDescending;
} else {
  return NSOrderedSame;
}


}];

NSLog(@"The contents of array = %@",[orderedPlaces description]);

块运行但它没有按预期排序locationsArray。 orderedPlaces返回未排序的locationsArray。通过在块组件上运行NSLOG,我看到它成功识别locationsArray并创建distance对象。我必须遗漏一些东西,因为我在项目的不同部分使用相同的代码,我将locationsArray与用户位置的lat长度进行比较,效果很好。请帮助我确定阻止其按预期工作的问题。

*如果您需要更多信息或说明,请询问。

2 个答案:

答案 0 :(得分:0)

我不明白你的排序块。您将距离A计算为abs(stationNumber- [locA intValue])。

什么是stationNumber?那是一些固定的整数索引吗?固定电台号码与电台中的电台号码之间的差异如何与距离有关?

在我看来,你的距离值应该是 (target.lat - this_station.lat)^ 2 +(target.long - this_station.long)^ 2

这将为您提供目标点与您正在比较的其中一个站点之间的毕达哥拉斯距离的平方。然后在比较中选择距离平方较小的项目。

您可以跳过平方根,因为您只是比较它们。这将使您的距离计算更快。

答案 1 :(得分:0)

试试这个:

NSArray *orderedPlaces = [CSVArray sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {

^(id a, id b)表示^void (id a, id b),您的返回值将被忽略。