1

Let's say I have NSMutableArray as below.

(
        {
        blockNumber = 1;
        boxId = 1;
        boxNumber = 4536;
        carId = 10;
        carNumber = 10;
        isDeleted = yes;
    },
        {
        blockNumber = 2;
        boxId = 2;
        boxNumber = 4537;
        carId = 10;
        carNumber = 10;
        isDeleted = yes;
    },
        {
        blockNumber = 3;
        boxId = 3;
        boxNumber = 4538;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 4;
        boxId = 4;
        boxNumber = 4539;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 5;
        boxId = 5;
        boxNumber = 4540;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 6;
        boxId = 6;
        boxNumber = 4541;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 7;
        boxId = 7;
        boxNumber = 4542;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 8;
        boxId = 8;
        boxNumber = 4543;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 9;
        boxId = 9;
        boxNumber = 4544;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 10;
        boxId = 10;
        boxNumber = 4545;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 11;
        boxId = 11;
        boxNumber = 4546;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 12;
        boxId = 12;
        boxNumber = 4547;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 13;
        boxId = 13;
        boxNumber = 4548;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 14;
        boxId = 14;
        boxNumber = 4549;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 15;
        boxId = 15;
        boxNumber = 4550;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 16;
        boxId = 16;
        boxNumber = 4551;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 17;
        boxId = 17;
        boxNumber = 4552;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 18;
        boxId = 18;
        boxNumber = 4553;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 19;
        boxId = 19;
        boxNumber = 4554;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 20;
        boxId = 20;
        boxNumber = 4555;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 21;
        boxId = 21;
        boxNumber = 4556;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 22;
        boxId = 22;
        boxNumber = 4557;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 23;
        boxId = 23;
        boxNumber = 4558;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 24;
        boxId = 24;
        boxNumber = 4559;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 25;
        boxId = 25;
        boxNumber = 4560;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 26;
        boxId = 26;
        boxNumber = 4561;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 27;
        boxId = 27;
        boxNumber = 4562;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 28;
        boxId = 28;
        boxNumber = 4563;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 29;
        boxId = 29;
        boxNumber = 4564;
        carId = 10;
        carNumber = 10;
        isDeleted = no;
    },
        {
        blockNumber = 30;
        boxId = 30;
        boxNumber = 4565;
        carId = 10;
        carNumber = 10;
        isDeleted = yes;
    }
)

What I want is number that will be me isDeleted = yes.

In my case, it is 3.

I know I can do this by looping like below.

for (NSMutableDictionary* aDict in carBoxesArray) {
    if ([aDict[@"isDeleted"] isEqualToString:@"yes"]) {
        findTotalYes++;
    }
}

However I am looking any another way (may be one liner) which will give me what I want.

Especially I don't want to use loop (as I can have more number of records in array which will take time in iteration)

Fahim Parkar
  • 30,974
  • 45
  • 160
  • 276
  • 3
    *Any* solution (explicit loop, predicate, Key-Value Coding) has to iterate over all elements. An explicit loop is probably the fastest solution. See http://stackoverflow.com/a/21158730/118741 or http://stackoverflow.com/a/15931719/1187415 for some comparisons. – Martin R Mar 12 '14 at 10:23

4 Answers4

4

You can use NSPredicate

NSArray *totalYes = [carBoxesArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(isDeleted == %@)", @"yes"]];

NSLog(@"Found Total YES: %d",totalYes.count);
βhargavḯ
  • 9,786
  • 1
  • 37
  • 59
0

You can use loop in background thread and use some loader in main thread. In this case display will not freeze when you are doing looping.

aparesidam
  • 309
  • 2
  • 13
0

You can use NSCountedSet as well :

NSCountedSet *countset = [NSCountedSet setWithArray:[carBoxesArray valueForKey:@"isDeleted"]];
NSInteger count = [countset countForObject:@"yes"];

As you asked for one liner, merge the above two lines to one:

NSInteger count = [[NSCountedSet setWithArray:[carBoxesArray valueForKey:@"isDeleted"]] countForObject:@"yes"];
Anoop Vaidya
  • 46,283
  • 15
  • 111
  • 140
0

u can also use enumeration,

like below

__block int count = 0;
[carBoxesArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
   if([[obj objectForKey:@"isDeleted"] isEqualToString:@"yes"])
       count++;
}];

NSLog(@"%d",count);
Shankar BS
  • 8,394
  • 6
  • 41
  • 53