(알고리즘) 52 장의 카드 (크 고 작은 왕 포함 하지 않 음) 는 51 장 밖 에 없 는데 어느 것 을 잃 어 버 렸 는 지 어떻게 확인 합 니까?

지난 글 에서 우 리 는 차 집 을 언급 했 는데 본 고 에서 우 리 는 사용 할 것 이다.http://www.jianshu.com/p/cd37e09e4374
본 고 는 Objective - C 1 을 사용 합 니 다. 우선, 우 리 는 포커 클래스 를 만 들 었 습 니 다.
@interface PokerModel : NSObject

//  
@property (nonatomic, assign) NSInteger color;

//  
@property (nonatomic, assign) NSInteger number;

+ (instancetype) pokerWithColor:(NSInteger )color
                         number:(NSInteger )number;

@end
@implementation PokerModel

+ (instancetype) pokerWithColor:(NSInteger )color
                         number:(NSInteger )number;
{
    PokerModel *poker = [[PokerModel alloc]init];
    poker.color = color;
    poker.number = number;
    return poker;
}

/**
           ,        
 */
- (BOOL)isEqual:(id)object
{
    if (![object isMemberOfClass:[self class]])
        return false;
    PokerModel *poker = object;
    return (poker.color == self.color)
    && (poker.number == self.number);
}

- (NSString *)description
{
    return [NSString stringWithFormat:@"%ld - %ld",self.color,self.number];
}

@end

클래스 의 코드 는 설명 하지 않 습 니 다. 2. 다음 에 우 리 는 먼저 모든 카드 를 만 듭 니 다.

    //    
    NSInteger allColorCount = 4;
    //    
    NSInteger allNumberCount = 13;

//         (     52    )
    NSMutableArray *allPoker = [NSMutableArray array];
    for (NSInteger color = 1; color <= allColorCount ; color ++)
    {
        for (NSInteger number = 1; number <= allNumberCount ; number ++)
        {
            PokerModel *poker = [PokerModel pokerWithColor:color number:number];
            [allPoker addObject:poker];
        }
    }

3. 잃 어 버 린 카드 를 무 작위 로 모 의 하여 현재 남 은 51 장의 카드 를 얻는다.
//             
    NSMutableArray *operatePoker = [NSMutableArray arrayWithArray:allPoker];
    //          
    PokerModel *losePoker = [PokerModel pokerWithColor:arc4random()%allColorCount + 1 number:arc4random()%allNumberCount + 1];
    //    
    [operatePoker removeObject:losePoker];
    
    NSLog(@"losePoker %@",losePoker);

인쇄 된 결 과 는?
losePoker 4 - 12

4. 이제 실현 의 포인트
//        
NSMutableSet *allPokerSet = [NSMutableSet setWithArray:allPoker];
    //        
    NSMutableSet *currentPokerSet = [NSMutableSet setWithArray:currentPoker];
    //                。  ,              
    [allPokerSet minusSet:currentPokerSet];
    //    
    NSLog(@"%@",allPokerSet);

인쇄 결과
{(
    4 - 12
)}

5. 그 다음 에 확대 해서 우 리 는 더 간단 한 방법 이 있다. 왜냐하면 위 에 우 리 는 이미 다시 썼 기 때문이다.
- (BOOL)isEqual:(id)object
{
    if (![object isMemberOfClass:[self class]])
        return false;
    PokerModel *poker = object;
    return (poker.color == self.color)
    && (poker.number == self.number);
}

무늬 와 숫자 가 모두 같다 면 우 리 는 같은 장 이 라 고 생각한다.우리 의 큰 방법 은 서술 어 를 사용 하 는 것 이다. 코드 는 다음 과 같다.
NSPredicate *predicatePOker = [NSPredicate predicateWithFormat:@"NOT ( SELF IN %@ )",currentPoker];  
NSArray *resultAry = [allPoker filteredArrayUsingPredicate:predicatePOker];
//    
    NSLog(@"losePoker %@",losePoker);
    NSLog(@"%@",resultAry);

결 과 는 다음 과 같다.
losePoker 1 - 13
(
    "1 - 13"
)

6. 그리고 더 독 한 것 은 모든 패 를 기 존 패 에서 빼 고 나머지 는 잃 어 버 린 것 이다.
 [allPoker removeObjectsInArray:currentPoker];
    
    NSLog(@"losePoker %@",losePoker);
    NSLog(@"%@",allPoker);

결 과 는 다음 과 같다.
losePoker 2 - 3

(
   "2 - 3"
)


이 를 통 해 알 수 있 듯 이 서술 어 를 사용 하면 몇 번 더 편리 하고 빠르게 실행 할 수 있 으 며 앞 뒤 두 번 인쇄 된 무늬 와 수 치 는 모두 같다.만일 당신 이 인내심 을 가지 고 다 보 았 다 면 부족 함 을 지적 해 주신 것 을 환영 합 니 다.당신 이 만약 좋 은 방안 이 있다 면, 우리 도 함께 진보 할 것 을 제기 해 주 십시오.

좋은 웹페이지 즐겨찾기