Как разделить NSMutableDictionary на два NSMutableArrays? - PullRequest
0 голосов
/ 14 февраля 2012

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

пример: Мой 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, если "distance": "2005.6281723630008" в словаре меньше 500 добавить в изменяемый массив1 другой мудрый добавить в изменяемый массив2

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

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, результат не появится ни в одном массиве.

1 голос
/ 14 февраля 2012

Как то так?

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 голосов
/ 13 февраля 2014

Похоже, вы анализируете 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];
...