2012-02-14 2 views
-1

Я пытаюсь разделить NSMutableDictionary на два NSMutableArrays сравнивая один KeyValue в NSMutableDictionary,как разделите NSMutableDictionary на два NSMutableArrays?

пример: Моего NSMutableDictionary

[ 
     { 
      "0": "87", 
      "1": "13270690451", 
      "2": "Delhi night's", 
      "3": "2106", 
      "4": ":)", 
      "5": "Kunwar", 
      "6": "28.601736", 
      "7": "77.159178", 
      "8": "16.107459108715", 
      "timeleft": "87", 
      "imageurl": "13270690451", 
      "beep": "Delhi night's", 
      "beepid": "2106", 
      "beepdescription": ":)", 
      "username": "Kunwar", 
      "Lat": "28.601736", 
      "long": "77.159178", 
      "distance": "16.107459108715" 
     }, 
     { 
      "0": "87", 
      "1": "13278710651", 
      "2": "Delhi IT hub", 
      "3": "2145", 
      "4": "LPT certification centre", 
      "5": "Kunwar", 
      "6": "28.491764", 
      "7": "77.082712", 
      "8": "2005.6281723630008", 
      "timeleft": "87", 
      "imageurl": "13278710651", 
      "beep": "Delhi IT hub", 
      "beepid": "2145", 
      "beepdescription": "LPT certification centre", 
      "username": "Kunwar", 
      "Lat": "28.491764", 
      "long": "77.082712", 
      "distance": "2005.6281723630008" 
     } 
] 

я хочу сделать два отдельных mutablearray если "расстояние": "+2005,6281723630008" в словаре меньше 500 добавить в mutable array1 другой мудрый добавить в изменчивый array2

+0

Это не похоже на диктонику. Это похоже на массив словарей. –

+0

Есть ли способ отсортировать это по моему запросу? – iPhoneDev

ответ

1

Что-то вроде этого?

NSArray *sortedArray = [originalArray sortedArrayUsingComparator:^(id a, id b) { 
    float fa = [[(NSDictionary*)a objectForKey:@"distance"] floatValue]; 
    float fb = [[(NSDictionary*)b objectForKey:@"distance"] floatValue]; 
    NSNumber *first = [NSNumber numberWithFloat:fa]; 
    NSNumber *second = [NSNumber numberWithFloat:fb]; 

    return [first compare:second]; 
}]; 

NSMutableArray *arr1 = [[NSMutableArray alloc] init]; 
NSMutableArray *arr2 = [[NSMutableArray alloc] init]; 

for (NSDictionary *dic in sortedArray) { 
    if ([[dic objectForKey:@"distance"] floatValue] < 500.0f) { 
     [arr1 addObject:dic]; 
    } else { 
     [arr2 addObject:dic]; 
    } 
} 
originalArray = nil; 
+0

Что такое originalArray? – iPhoneDev

+0

@iphoneDev Вы действительно не должны использовать это, NSPredicate намного быстрее. –

+0

Вы можете ограничить поиск с помощью подхода «NSPredicate». Но я думаю, что у автора будет достаточно проблем с чем-то вроде выше. – basvk

1

NSPredicate было сделано для решения этой задачи, вы можете использовать его как это:

#define DOUBLE_OBJ(x) [NSNumber numberWithDouble:x] 
NSDictionary *location1 = [NSDictionary dictionaryWithObject:DOUBLE_OBJ(16.107459108715) forKey:@"distance"]; 
NSDictionary *location2 = [NSDictionary dictionaryWithObject:DOUBLE_OBJ(2005.6281723630008) forKey:@"distance"]; 
NSDictionary *location3 = [NSDictionary dictionaryWithObject:DOUBLE_OBJ(250) forKey:@"distance"]; 
NSDictionary *location4 = [NSDictionary dictionaryWithObject:DOUBLE_OBJ(750) forKey:@"distance"]; 

NSMutableArray *locations = [NSMutableArray arrayWithObjects:location1, location2, location3, location4, nil]; 

NSArray *locationsLessThan500 = [locations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"distance < 500"]]; 
NSArray *locationsGreaterThan500 = [locations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"distance > 500"]]; 

NSLog(@"locations: %@", locations); 
NSLog(@"locations less than 500: %@", locationsLessThan500); 
NSLog(@"locations greater than 500: %@", locationsGreaterThan500); 

Конечно, если расстояние равно 500, то результат не будет отображаться в любом массиве.

+0

местоположение u hardcode это нужно сделать? так как у меня уже есть изменяемый массив с ключом «расстояние» – iPhoneDev

+0

. Я получаю эту ошибку, используя это - [__ NSCFNumber length]: нераспознанный селектор, отправленный в экземпляр 0x11cda0 – iPhoneDev

+0

@iPhoneDev нет, вам не нужно жестко указывать длину. Если у вас уже есть массив, вы можете просто использовать вызов '-filteredArrayUsingPredicate:'. –

0

Похоже, что вы разбираете JSON. Во-первых, скажите, кто создал эти данные, которые поддерживает JSON. Lat, long и distance должны быть числами, а не строками. И кто использует один ключ с верхним регистром L и одним ключом с нижним регистром l? Разве эти люди не могут использовать свои клавиатуры? То есть так с просьбой о проблемах, где кто-то будет использовать неправильное написание и искать часы для ошибки.

NSMutableArray* shortDistance = [NSMutableArray array]; 
NSMutableArray* longDistance = [NSMutableArray array]; 

for (NSDictionary* dict in myArray) 
{ 
    if (dict [@"distance"].doubleValue < 500.0) 
     [shortDistance addObject:dict]; 
    else 
     [longDistance addObject:dict]; 
} 

Никогда не используйте floatValue, если у вас есть хорошая причина, по которой вы можете объяснить и защитить, почему вы должны использовать floatValue и не doubleValue.

Если есть вероятность, что ваши данные имеют нулевые значения для расстояния, вам нужно будет проверить это, или ваша программа выйдет из строя.

не достаточно очков, чтобы добавить комментариев:

Это DOUBLE_OBJ макрос просто ужасно. Чтобы получить NSNumber со значением, напишите, например,

@100 // Same as [NSNumber numberWithInt:100] 
@12.34 // Same as [NSNumber numberWithDouble:12.34] 
double x = ...; double y = ...; @(x + y) // Same as [NSNumber numberWithDouble:x + y] 

Это часть языка Objective-C. И вы пишете

NSDictionary *location1 = { @"distance": @16.107459108715 }; 
NSDictionary *location2 = { @"distance": @2005.6281723630008 }; 
NSDictionary *location3 = { @"distance": @250 }; 
NSDictionary *location4 = { @"distance": @750 }; 

NSArray *locations = @[location1, location2, location3, location4]; 
Смежные вопросы