본문 바로가기
iOS/Objective-C

NSDictionary

by 패쓰킴 2022. 11. 4.
728x90
// 방법 1
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil];

// 방법 2
NSDictionary *dictionary = @{@"key", @"value"};

 

dictionary 배열에서 원하는 key의 value 개수 필터링

list : [
  {
    "age" : 3,
    "grade" : "A"
  },
  {
    "age" : 32,
    "grade" : "B"
  },
  {
    "age" : 14,
    "grade" : "C"
  },
  {
    "age" : 6,
    "grade" : "A"
  }
]

위와 같은 형식의 배열이라고 해보자,

grade별 value counting하여 원하는 결과는 다음과 같다.

{ "A" : 2, 
  "B" : 1,
  "C" : 1
}

 

==>

먼저 list의 첫번째 값을 딕셔너리에 넣고,

NSMutableDictionary * filterDic = [NSMutableDictionary new];
[filterDic setObject:@1 forKey:[[list objectAtIndex:0] objectForKey:@"grade"]];

list를 순회하면서 이미 있는 key인지 아닌지 확인하여 딕셔너리를 업데이트 해준다.

for (int i = 1; i < [list count]; i++) {
  NSString * grade = [[list objectAtIndex:i] objectForKey:@"grade"];
  if ([filterDic objectForKey:grade] == nil) {
    [filterDic setObject:@1 forKey:grade];
  } else {
    [filterDic setObject:@([[filterDic objectForKey:grade] intValue] + 1) forKey:grade];
  }
}

NSArray * arr = [{grade:a,time:1},
                 {grade:b,time:1},
                 {grade:a,time:2},
                 {grade:a,time:3}
                ];

이런, 딕셔너리를 갖는 배열을 공통되는 값들로 필터링된 배열로 바꾸고 싶을때,

아래와 같은 형식으로 만들고 싶을 때

[{
  grade = a
  info = [{time:1},
          {time:2},
          {time:3}
         ]
 },
 {
  grade = b
  info = [{time:1}
         ]
 }
]

 

NSMutableArray * myArr = [NSMutableArray new];

for (int i = 0; i < [dataArr count]; i++) {
  NSMutableArray * timeArr = [NSMutableArray new];
  NSPredicate * predicate = [NSPredicate predicateWithFormat:@"(grade contains[c] %@)", [[dataArr objectAtIndex:i] objectForKey:@"grade"]];
  NSArray * predicateResult = [myArr filteredArrayUsingPredicate:predicate];
  if ([predicateResult count] == 0) {
    [timeArr addObject:[dataArr objectAtIndex:i]];
            
    for (int j = i+1; j < [dataArr count]; j++) {
      NSString * iKey = [[dataArr objectAtIndex:i] objectForKey:@"grade"];
      NSString * jKey = [[dataArr objectAtIndex:j] objectForKey:@"grade"];
      if ([iKey isEqualToString: jKey]) {
        [timeArr addObject:[dataArr objectAtIndex:j]];
      }
    }
    NSString * key = [[dataArr objectAtIndex:i] objectForKey:@"grade"];
    NSDictionary * dic = @{@"grade":key, @"time":timeArr};
    [myArr addObject:dic];
  }
}

 

728x90

'iOS > Objective-C' 카테고리의 다른 글

NSArray  (0) 2022.11.02
NSMutableArray  (0) 2022.11.02
NSString  (0) 2022.10.27
UIButton  (0) 2022.09.28
NotificationCenter(Observer)  (0) 2022.06.10

댓글