1

NSString に可能な各数字 (0-9) が 5 回以上含まれているかどうかを確認したいと思います。どの数字または何回あるかを知る必要はありません。数字のいずれかが文字列に5回以上含まれているかどうかについて、TRUEまたはFalseを返したいだけです。なるべく効率よく進めていきたいです。

私はそれについていくつかの考えを与えました、そしてそれについての長い道のりは、10桁すべて(再び0-9)を配列に配置し、次に各桁をループして文字列と比較することです. 文字列内に 5 つ以上の一致がある場合は、true を返すフラグを配置します。

この問題に対処するための「より良い」またはより効率的な方法があるかどうか、誰か教えてもらえますか?

ありがとうございました!

4

4 に答える 4

2

このコードは、可能な限りパフォーマンスを上げようとします。

BOOL checkDigits(NSString *string)
{
    // get the raw UTF-16 code fragments, hopefully without a copy
    const UniChar *characters = CFStringGetCharactersPtr((__bridge CFStringRef)string);
    NSData *characterData = nil;
    if (characters == NULL) {
        characterData = [string dataUsingEncoding:NSUTF16StringEncoding];
        characters = [characterData bytes];
    }

    // initialize 10 individual counters for digits
    int digitCount[10] = {};
    NSUInteger length = [string length];

    // loop over the characters once
    for (NSUInteger i = 0; i != length; ++i) {
        UniChar c = characters[i];

        // UTF-16 encodes ASCII digits as their values
        if (c >= '0' && c <= '9') {
            int idx = c - '0';
            if (digitCount[idx] == 4)
                return YES;
            digitCount[idx] += 1;
        }
    }

    // keep the NSData object alive until here
    [characterData self];

    return NO;
}
于 2013-08-14T10:42:40.163 に答える
0

次のコードを使用して、文字列に 0-9 が含まれていることを確認します。

NSUInteger count = 0, length = [yourString length];
    NSRange range = NSMakeRange(0, length); 
    while(range.location != NSNotFound)
   {
     range = [yourString rangeOfString: @"hello" options:0 range:range];
     if(range.location != NSNotFound)
     {
        range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
       count++; 
    }
  }
于 2013-08-14T10:34:02.473 に答える
-1
NSString *materialnumber =[[self.documentItemsArray objectAtIndex:indexPath.row] getMATERIAL_NO];
            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES '[0-9*]+'"];
            if ([predicate evaluateWithObject:materialnumber])
            {
                materialnumber = [NSString stringWithFormat:@"%d",[materialnumber intValue]];
            }
于 2013-08-14T10:24:15.583 に答える