2011-11-28 2 views
0
NSMutableSet *intersection = [NSMutableSet setWithArray:newsmall]; 

//this shows an array of newsmall as expected 
NSLog(@"intersection %@", intersection); 

[intersection intersectSet:[NSSet setWithArray:newnewbig]]; 

//this shows nothing 
NSLog(@"intersection %@", intersection); 

//this shows an array of newnewbig as expected 
NSLog(@"newnewbig %@", newnewbig); 

NSArray *arrayfour = [intersection allObjects]; 

//this shows nothing 
NSLog(@"arrayfour %@", arrayfour); 

newsmall과 newnewbig에 일치하는 문자열이 있으므로 arrayfour에 몇 개의 문자열이 표시 될 것으로 예상됩니다.NSSet의 NSArray는 NSLog에 아무것도 표시하지 않습니다.

내가 뭘 잘못 했니?

답변

2

문제는 어떻게 intersectSet 작품의 이해에있다.

나는 newsmall과 newnewbig에서 문자열의 내용을 비교할 것을 기대하고있다. 그러나 실제로하고있는 것은 객체 주소를 비교하는 것이다. 당신이 intersectSet 호출을하기 전에

는이 작업을 수행 : 주소 (거기 형식의 %p)이 일치하는 경우

NSUInteger index = 0; 
for(NSString * aString in newsmall) 
{ 
    NSLog(@"newsmall string %d is %p %@", index++, aString, aString); 
} 

index = 0; 
for(NSString * aString in newnewbig) 
{ 
    NSLog(@"newnewbig string %d is %p %@", index++, aString, aString); 
} 

intersectSet에만 작동합니다. 문자열 내용이 일치 할 수도 있지만 intersectSet이 염려하는 것은 문자열 주소입니다.

정말, 해결 방법은 문자열간에 세트를 비교하는 다른 방법을 사용해야한다는 것입니다.

2

intersectSet으로 전화하면 NSString의 내용이 아니라 포인터를 비교한다고 생각합니다.

은 도움이 될 수 있습니다, 여기를 보라 : SO Question