<출처 : http://wwwww.kr/objectivec/30984>
NSCountedSet 클래스
중복 데이터가 오면 count 값을 1개 올려서 저장하는 set 클래스입니다.
위의 클래스 들이 가지고 있는 메서드에 아래와 같은 메서드를 더 가지고 있습니다.
-(NSUInteger) countForObject:obj : obj의 개수
01.
#import <Foundation/Foundation.h>
02.
int
main (
int
argc,
const
char
* argv[])
03.
{
04.
NSAutoreleasePool *pool = [NSAutoreleasePool
new
];
05.
NSCountedSet *set = [NSCountedSet set];
//CountedSet은 몇번 들어왔는지 세고 있음
06.
NSNumber * element;
07.
[set addObject:[NSNumber numberWithInt:1]];
08.
[set addObject:[NSNumber numberWithInt:3]];
09.
[set addObject:[NSNumber numberWithInt:2]];
10.
[set addObject:[NSNumber numberWithInt:1]];
11.
[set addObject:[NSNumber numberWithInt:2]];
12.
[set addObject:[NSNumber numberWithInt:4]];
13.
NSLog(@
"전체 개수 = %u개"
, [set count]);
14.
for
(element in set)
15.
NSLog(@
"%@의 개수:%u 개"
, element,[set countForObject:element]);
//각 element가 몇 번씩 들어왔는지 알 수 있다.
16.
[pool drain];
17.
return
0;
18.
}
결과
2010-11-11 10:37:15.149 d6test[1423:a0f] 전체 개수 = 4개
2010-11-11 10:37:15.154 d6test[1423:a0f] 3의 개수:1 개
2010-11-11 10:37:15.155 d6test[1423:a0f] 2의 개수:2 개
2010-11-11 10:37:15.155 d6test[1423:a0f] 1의 개수:2 개
2010-11-11 10:37:15.156 d6test[1423:a0f] 4의 개수:1 개
Dictionary
- 키와 인스턴스로 이루어진 데이터의 모임입니다.
- 키로 인스턴스를 찾을 수 있습니다.
- 키(NSString)는 유일해야 하며 일반적으로 NSString 입니다.
- 키와 연결된 인스턴스는 데이터 유형에 관계가 없지만 nil(데이터가 비어있음)은 안됩니다.
1. NSDictionary
NSDictionary는 수정이 불가능한 Dictionary입니다.
중요한것 :
count : 요소의 갯수
ObjectForKey : 키값에 해당하는 Object를 리턴
allKeys : 모든 키 값을 배열로 리턴
allValues : 모든 데이터를 찾아 줌
멤버 메서드
+(id)dictionary : 비어있는 dictionary 생성
+(id)dictionaryWithObject:(id)anObject forKey:(id)aKey : aKey를 key로 해서 anObject를 내용으로 갖는 한 쌍의 인스턴스를 갖는 dictionary 생성
-(id)initWithObjects:(NSArray *)Objects forKeys:(NSArray *)Keys : Keys를 키 값으로 해서 Objects를 내용으로 여러 쌍을 초기화
-(id)initWithObjects:(id *)Objects forKeys:(id *)Keys count:(NSUInteger)count : Keys를 키 값으로 해서 Objects를 내용으로 count 개수 만큼 초기화
-(id)initWithObjectsAndKeys:(id)Object,(id)Key,… nil : Object와 Key로 초기화
-(NSUInteger)count : 개수 리턴
-(id)objectForKey:(id)aKey : aKey에 해당하는 인스턴스 리턴
-(NSArray *)allKeys : 모든 키값을 배열로 리턴
-(NSArray *)allValues : 모든 키를 포함하는 배열을 리턴
-(NSEnumerator *)keyEnumerator : 키 값을 열거자로 리턴
-(NSEnumerator *)objectEnumerator : 키 값을 열거자로 리턴
-(NSArray *)allKeysForObject:(id)anObject : anObject를 갖는 모든 키를 배열로 리턴
01.
#import <Foundation/Foundation.h>
02.
int
main (
int
argc,
const
char
* argv[])
03.
{
04.
NSAutoreleasePool *pool = [NSAutoreleasePool
new
];
05.
06.
//greeting이라는 Dictionary를 만듬
07.
//아침인사 라는 키로 안녕하세요
08.
//점심인사 라는 키로 식사 하셨어요
09.
//저녁인사 라는 키로 내일뵐께요
10.
//로 저장하고 있는 NSDictionary 객체 생성
11.
NSDictionary * greeting = [[NSDictionary alloc] initWithObjectsAndKeys:@
"안녕하세요"
, @
"아침인사"
, @
"식사 하셨어요"
, @
"오후인사"
, @
"내일뵐께요"
,@
"저녁인사"
,nil ];
12.
//뒤에있는건 key 앞에있는건 object로 저장됨
13.
//복수는 마지막에 nil로 막아야 함
14.
15.
//각각의 키로 Object를 찾아서 출력
16.
NSLog(@
"아침인사: %@"
, [greeting objectForKey: @
"아침인사"
]);
//아침인사라는 키로 오브젝트를 불러옴
17.
NSLog(@
"점심인사: %@"
, [greeting objectForKey: @
"오후인사"
]);
18.
NSLog(@
"저녁인사: %@"
, [greeting objectForKey: @
"저녁인사"
]);
19.
20.
//for - in 을 이용하면 Dictionary에서는 키 값을 따라 순회한다.
21.
for
(NSString *temp in greeting)
//greeting을 temp에 저장
22.
NSLog(@
"key:%@ value:%@"
, temp, [greeting objectForKey:temp]);
23.
//key=temp, objectForKey:temp에 해당하는 키를 가져옴
24.
25.
[pool drain];
26.
return
0;
27.
}
결과
2010-11-11 10:51:38.252 d6test[1534:a0f] 아침인사: 안녕하세요
2010-11-11 10:51:38.254 d6test[1534:a0f] 점심인사: 식사 하셨어요
2010-11-11 10:51:38.254 d6test[1534:a0f] 저녁인사: 내일뵐께요
2010-11-11 10:51:38.255 d6test[1534:a0f] key:저녁인사 value:내일뵐께요
2010-11-11 10:51:38.255 d6test[1534:a0f] key:아침인사 value:안녕하세요
2010-11-11 10:51:38.256 d6test[1534:a0f] key:오후인사 value:식사 하셨어요
01.
#import <Foundation/Foundation.h>
02.
int
main (
int
argc,
const
char
* argv[])
03.
{
04.
NSAutoreleasePool * pool = [NSAutoreleasePool
new
];
05.
06.
// File 메뉴
07.
NSArray * File = [NSArray arrayWithObjects:@
"새로만들기"
,@
"열기"
,@
"저장"
,@
"닫기"
,nil];
08.
// alloc]initWithObjects 를 이용해도 된다. - 사용자가 release해줘야 함
09.
10.
// Edit 메뉴
11.
NSArray * Edit = [NSArray arrayWithObjects:@
"취소"
,@
"재실행"
,@
"복사"
,@
"잘라내기"
,@
"붙여넣기"
,nil];
12.
//objective-c의 배열로 묶기
13.
NSArray * Menu = [NSArray arrayWithObjects:File,Edit,nil];
14.
15.
//출력 시작
16.
for
(NSArray * temp in Menu)
//Menu에 있는 모든 멤버를 temp로 가져옴
17.
{
18.
if
(temp==File)
19.
NSLog(@
"File"
);
20.
else
if
(temp==Edit)
21.
NSLog(@
"Edit"
);
22.
NSLog(@
"--------------------"
);
23.
24.
for
(NSString * imsi in temp)
//멤버의 내용이 문자열이므로 NSString
25.
{
26.
NSLog(@
" %@"
,imsi);
27.
}
28.
}
29.
30.
/* 배열에 접근 (하나 일땐 요렇게!)
31.
for(NSString * temp in File)
32.
NSLog(@"%@",temp);
33.
34.
또는
35.
for(int i=0;i<[File count]; i++)
36.
NSLog(@"%@",[File objectAtIndex:0]); //Index를 가져올땐 objectAtIndex를 사용
37.
이렇게 해도 됨 */
38.
39.
[pool drain];
40.
return
0;
41.
}
결과
2010-11-11 11:26:36.112 d6test[1794:a0f] File
2010-11-11 11:26:36.114 d6test[1794:a0f] --------------------
2010-11-11 11:26:36.114 d6test[1794:a0f] 새로만들기
2010-11-11 11:26:36.115 d6test[1794:a0f] 열기
2010-11-11 11:26:36.115 d6test[1794:a0f] 저장
2010-11-11 11:26:36.116 d6test[1794:a0f] 닫기
2010-11-11 11:26:36.116 d6test[1794:a0f] Edit
2010-11-11 11:26:36.116 d6test[1794:a0f] --------------------
2010-11-11 11:26:36.117 d6test[1794:a0f] 취소
2010-11-11 11:26:36.117 d6test[1794:a0f] 재실행
2010-11-11 11:26:36.118 d6test[1794:a0f] 복사
2010-11-11 11:26:36.118 d6test[1794:a0f] 잘라내기
2010-11-11 11:26:36.119 d6test[1794:a0f] 붙여넣기
여기에 삽입(insert)메뉴를 추가하고 싶으면
01.
#import <Foundation/Foundation.h>
02.
int
main (
int
argc,
const
char
* argv[])
03.
{
04.
NSAutoreleasePool * pool = [NSAutoreleasePool
new
];
05.
06.
// File 메뉴
07.
NSArray * File = [NSArray arrayWithObjects:@
"새로만들기"
,@
"열기"
,@
"저장"
,@
"닫기"
,nil];
08.
// alloc]initWithObjects 를 이용해도 된다. - 사용자가 release해줘야 함
09.
10.
// Edit 메뉴
11.
NSArray * Edit = [NSArray arrayWithObjects:@
"취소"
,@
"재실행"
,@
"복사"
,@
"잘라내기"
,@
"붙여넣기"
,nil];
12.
13.
// Insert 메뉴 추가 -1단계
14.
NSArray * Insert = [NSArray arrayWithObjects:@
"그림"
,@
"노래"
,@
"파일"
,nil];
15.
16.
//objective-c의 배열로 묶기
17.
NSArray * Menu = [NSArray arrayWithObjects:File,Edit,Insert,nil];
// 배열 추가 -2단계
18.
19.
20.
for
(NSArray * temp in Menu)
//Menu에 있는 모든 멤버를 temp로 가져옴
21.
{
22.
if
(temp==File)
23.
NSLog(@
"File"
);
24.
else
if
(temp==Edit)
25.
NSLog(@
"Edit"
);
26.
else
if
(temp==Insert)
//출력구문 추가 -3단계
27.
NSLog(@
"Insert"
);
28.
NSLog(@
"--------------------"
);
29.
30.
for
(NSString * imsi in temp)
//멤버의 내용이 문자열이므로 NSString
31.
{
32.
NSLog(@
" %@"
,imsi);
33.
}
34.
}
35.
36.
/* 배열에 접근 (하나 일땐 요렇게!)
37.
for(NSString * temp in File)
38.
NSLog(@"%@",temp);
39.
40.
또는
41.
for(int i=0;i<[File count]; i++)
42.
NSLog(@"%@",[File objectAtIndex:0]); //Index를 가져올땐 objectAtIndex를 사용
43.
이렇게 해도 됨 */
44.
45.
[pool drain];
46.
return
0;
47.
}
결과
2010-11-11 11:35:39.047 d66tst[1975:a0f] File
2010-11-11 11:35:39.049 d66tst[1975:a0f] --------------------
2010-11-11 11:35:39.049 d66tst[1975:a0f] 새로만들기
2010-11-11 11:35:39.050 d66tst[1975:a0f] 열기
2010-11-11 11:35:39.050 d66tst[1975:a0f] 저장
2010-11-11 11:35:39.051 d66tst[1975:a0f] 닫기
2010-11-11 11:35:39.051 d66tst[1975:a0f] Edit
2010-11-11 11:35:39.051 d66tst[1975:a0f] --------------------
2010-11-11 11:35:39.052 d66tst[1975:a0f] 취소
2010-11-11 11:35:39.052 d66tst[1975:a0f] 재실행
2010-11-11 11:35:39.053 d66tst[1975:a0f] 복사
2010-11-11 11:35:39.053 d66tst[1975:a0f] 잘라내기
2010-11-11 11:35:39.053 d66tst[1975:a0f] 붙여넣기
2010-11-11 11:35:39.054 d66tst[1975:a0f] Insert
2010-11-11 11:35:39.054 d66tst[1975:a0f] --------------------
2010-11-11 11:35:39.055 d66tst[1975:a0f] 그림
2010-11-11 11:35:39.055 d66tst[1975:a0f] 노래
2010-11-11 11:35:39.055 d66tst[1975:a0f] 파일
추가할때 간단한 작업으로 수정할 수가 있다.
하지만 딕셔너리를 이용하면 더욱 편리해진다.
예제
01.
#import <Foundation/Foundation.h>
02.
int
main (
int
argc,
const
char
* argv[])
03.
{
04.
NSAutoreleasePool * pool = [NSAutoreleasePool
new
];
05.
06.
// File 메뉴
07.
NSArray * File = [NSArray arrayWithObjects:@
"새로만들기"
,@
"열기"
,@
"저장"
,@
"닫기"
,nil];
08.
09.
// Edit 메뉴
10.
NSArray * Edit = [NSArray arrayWithObjects:@
"취소"
,@
"재실행"
,@
"복사"
,@
"잘라내기"
,@
"붙여넣기"
,nil];
11.
12.
// Insert 메뉴 - 추가 전
13.
// NSArray * Insert = [NSArray arrayWithObjects:@"그림",@"노래",@"파일",nil];
14.
15.
//Dictionary의 사용
16.
NSDictionary * dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@
"File"
,@
"Title"
,File,@
"SubMenu"
,nil];
17.
NSDictionary * dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@
"Edit"
,@
"Title"
,Edit,@
"SubMenu"
,nil];
18.
19.
NSArray * Menu = [NSArray arrayWithObjects:dic1,dic2,nil];
20.
21.
for
(NSDictionary * dic in Menu)
22.
{
23.
NSLog(@
" %@"
,[dic objectForKey:@
"Title"
]);
24.
NSArray * temp = [dic objectForKey:@
"SubMenu"
];
25.
NSLog(@
"--------------"
);
26.
for
(NSString * imsi in temp)
27.
{
28.
NSLog(@
" %@"
,imsi);
29.
}
30.
}
31.
32.
[pool drain];
33.
return
0;
34.
}
결과
2010-11-11 11:53:51.507 d66tst[2243:a0f] File
2010-11-11 11:53:51.509 d66tst[2243:a0f] --------------
2010-11-11 11:53:51.509 d66tst[2243:a0f] 새로만들기
2010-11-11 11:53:51.509 d66tst[2243:a0f] 열기
2010-11-11 11:53:51.510 d66tst[2243:a0f] 저장
2010-11-11 11:53:51.510 d66tst[2243:a0f] 닫기
2010-11-11 11:53:51.511 d66tst[2243:a0f] Edit
2010-11-11 11:53:51.511 d66tst[2243:a0f] --------------
2010-11-11 11:53:51.516 d66tst[2243:a0f] 취소
2010-11-11 11:53:51.518 d66tst[2243:a0f] 재실행
2010-11-11 11:53:51.519 d66tst[2243:a0f] 복사
2010-11-11 11:53:51.519 d66tst[2243:a0f] 잘라내기
2010-11-11 11:53:51.520 d66tst[2243:a0f] 붙여넣기
예제 추가
01.
#import <Foundation/Foundation.h>
02.
int
main (
int
argc,
const
char
* argv[])
03.
{
04.
NSAutoreleasePool * pool = [NSAutoreleasePool
new
];
05.
06.
// File 메뉴
07.
NSArray * File = [NSArray arrayWithObjects:@
"새로만들기"
,@
"열기"
,@
"저장"
,@
"닫기"
,nil];
08.
09.
// Edit 메뉴
10.
NSArray * Edit = [NSArray arrayWithObjects:@
"취소"
,@
"재실행"
,@
"복사"
,@
"잘라내기"
,@
"붙여넣기"
,nil];
11.
12.
// Insert 메뉴 - 추가
13.
NSArray * Insert = [NSArray arrayWithObjects:@
"그림"
,@
"동영상"
,@
"파일"
,nil];
// 추가 1단계
14.
15.
//Dictionary의 사용
16.
NSDictionary * dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@
"File"
,@
"Title"
,File,@
"SubMenu"
,nil];
17.
NSDictionary * dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@
"Edit"
,@
"Title"
,Edit,@
"SubMenu"
,nil];
18.
NSDictionary * dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@
"Insert"
,@
"Title"
,Insert,@
"SubMenu"
,nil];
//추가 2단계
19.
20.
NSArray * Menu = [NSArray arrayWithObjects:dic1,dic2,dic3,nil];
// 추가 3단계
21.
22.
//출력부분은 놔둬도 됨
23.
for
(NSDictionary * dic in Menu)
24.
{
25.
NSLog(@
" %@"
,[dic objectForKey:@
"Title"
]);
26.
NSArray * temp = [dic objectForKey:@
"SubMenu"
];
27.
NSLog(@
"--------------"
);
28.
for
(NSString * imsi in temp)
29.
{
30.
NSLog(@
" %@"
,imsi);
31.
}
32.
}
33.
34.
[pool drain];
35.
return
0;
36.
}
결과
2010-11-11 12:02:58.517 d66tst[2478:a0f] File
2010-11-11 12:02:58.519 d66tst[2478:a0f] --------------
2010-11-11 12:02:58.520 d66tst[2478:a0f] 새로만들기
2010-11-11 12:02:58.520 d66tst[2478:a0f] 열기
2010-11-11 12:02:58.522 d66tst[2478:a0f] 저장
2010-11-11 12:02:58.522 d66tst[2478:a0f] 닫기
2010-11-11 12:02:58.523 d66tst[2478:a0f] Edit
2010-11-11 12:02:58.523 d66tst[2478:a0f] --------------
2010-11-11 12:02:58.523 d66tst[2478:a0f] 취소
2010-11-11 12:02:58.524 d66tst[2478:a0f] 재실행
2010-11-11 12:02:58.524 d66tst[2478:a0f] 복사
2010-11-11 12:02:58.525 d66tst[2478:a0f] 잘라내기
2010-11-11 12:02:58.525 d66tst[2478:a0f] 붙여넣기
2010-11-11 12:02:58.525 d66tst[2478:a0f] Insert
2010-11-11 12:02:58.526 d66tst[2478:a0f] --------------
2010-11-11 12:02:58.526 d66tst[2478:a0f] 그림
2010-11-11 12:02:58.527 d66tst[2478:a0f] 동영상
2010-11-11 12:02:58.527 d66tst[2478:a0f] 파일
01.
#import <Foundation/Foundation.h>
02.
int
main (
int
argc,
const
char
* argv[])
03.
{
04.
NSAutoreleasePool * pool = [NSAutoreleasePool
new
];
05.
NSArray *KIA;
06.
NSArray *SK;
07.
NSArray *HD;
08.
NSArray *LG;
09.
KIA = [NSArray arrayWithObjects:@
"윤석민"
, @
"이용규"
, @
"이종범"
,@
"서재응"
, @
"양현종"
, nil];
10.
SK = [NSArray arrayWithObjects:@
"김광현"
, @
"고효준"
, @
"김재현"
,@
"정근우"
, @
"나주환"
, nil];
11.
HD = [NSArray arrayWithObjects:@
"클락"
,@
"황재균"
, nil];
12.
LG = [NSArray arrayWithObjects:@
"박용택"
, @
"이택근"
, @
"이병규"
, @
"봉중근"
, nil];
13.
NSDictionary *Dic1, *Dic2, *Dic3, *Dic4;
14.
Dic1 = [[NSDictionary alloc] initWithObjectsAndKeys:@
"KIA"
, @
"Team"
, KIA, @
"data"
, nil];
15.
Dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:@
"SK"
, @
"Team"
, SK, @
"data"
, nil];
16.
Dic3 = [[NSDictionary alloc] initWithObjectsAndKeys:@
"HD"
, @
"Team"
, HD, @
"data"
, nil];
17.
Dic4 = [[NSDictionary alloc] initWithObjectsAndKeys:@
"LG"
, @
"Team"
, LG, @
"data"
, nil];
18.
NSArray *data = [[NSArray alloc] initWithObjects:Dic1, Dic2, Dic3, Dic4, nil];
19.
[Dic1 release];
20.
[Dic2 release];
21.
[Dic3 release];
22.
[Dic4 release];
23.
for
(NSDictionary * dic in data)
24.
{
25.
NSString * team = [dic objectForKey:@
"Team"
];
26.
NSArray * ar = [dic objectForKey:@
"data"
];
27.
NSLog(@
"team:%@"
, team);
28.
NSLog(@
"======================"
);
29.
for
(NSString * name in ar)
30.
NSLog(@
"%@"
, name);
31.
NSLog(@
" "
);
32.
}
33.
[pool drain];
34.
return
0;
35.
}
결과
2010-11-11 11:07:19.102 d6test[1670:a0f] team:KIA
2010-11-11 11:07:19.105 d6test[1670:a0f] ======================
2010-11-11 11:07:19.105 d6test[1670:a0f] 윤석민
2010-11-11 11:07:19.106 d6test[1670:a0f] 이용규
2010-11-11 11:07:19.106 d6test[1670:a0f] 이종범
2010-11-11 11:07:19.107 d6test[1670:a0f] 서재응
2010-11-11 11:07:19.107 d6test[1670:a0f] 양현종
2010-11-11 11:07:19.107 d6test[1670:a0f]
2010-11-11 11:07:19.108 d6test[1670:a0f] team:SK
2010-11-11 11:07:19.108 d6test[1670:a0f] ======================
2010-11-11 11:07:19.109 d6test[1670:a0f] 김광현
2010-11-11 11:07:19.109 d6test[1670:a0f] 고효준
2010-11-11 11:07:19.110 d6test[1670:a0f] 김재현
2010-11-11 11:07:19.110 d6test[1670:a0f] 정근우
2010-11-11 11:07:19.110 d6test[1670:a0f] 나주환
2010-11-11 11:07:19.114 d6test[1670:a0f]
2010-11-11 11:07:19.115 d6test[1670:a0f] team:HD
2010-11-11 11:07:19.115 d6test[1670:a0f] ======================
2010-11-11 11:07:19.116 d6test[1670:a0f] 클락
2010-11-11 11:07:19.117 d6test[1670:a0f] 황재균
2010-11-11 11:07:19.118 d6test[1670:a0f]
2010-11-11 11:07:19.118 d6test[1670:a0f] team:LG
2010-11-11 11:07:19.119 d6test[1670:a0f] ======================
2010-11-11 11:07:19.119 d6test[1670:a0f] 박용택
2010-11-11 11:07:19.120 d6test[1670:a0f] 이택근
2010-11-11 11:07:19.120 d6test[1670:a0f] 이병규
2010-11-11 11:07:19.121 d6test[1670:a0f] 봉중근
2010-11-11 11:07:19.121 d6test[1670:a0f]
2. NSMutableDictionary
NSMutableDictionary는 수정이 가능한 Dictionary입니다.
아래와 같은 메서드가 추가됩니다.
+(id) dictionaryWithCapacity:size : size 크기만큼으로 메모리 할당
-(id)initWithCapacity:size : size 크기만큼으로 초기화
-(void)setObject:(id)anObject forKey:(id)aKey : aKey를 Key로 anObject를 추가합니다.
둘 다 nil이면 안되고 aKey가 존재한다면 내용은 대체됩니다.
-(void)removeAllObjects : 모든 엔트리 삭제
-(void)removeObjectForKey:key : key에 해당하는 인스턴스 삭제
-(NSArray *)keysSortedByValueUsingSelector:@selector(비교메서드:) : 이 경우 내용에 따라서 정렬한 후 key를 배열로 리턴합니다.