2016-03-09 3 views
1

Я пытаюсь получить повторяющиеся символы в NSString с их счетчиком.Получить общий символ (ы) из NSString в качестве подстроки

Например, setupsetpreset в качестве входных данных и возвращает «набор» вместе с графом 3.

Позвольте мне объяснить с другим примером.

вход 1: upsetpreset

Ожидаемый результат 1: набор 2

вход 2: qwertygdgpopgdg

Ожидаемый результат 2: ГДГ 2 ​​

+1

Какова минимальная длина подстроки? – trojanfoe

+0

очевидно 2 и, используя это, мне нужно получить такую ​​же фразу –

+1

Предположим, что следующая строка. Sheraheshehehesheshe Какой должен быть выход? Как видите, «Она» и «он» повторяются. –

ответ

2

См ниже

NSString *string  = @"This is a test. This is only a test."; 
NSCountedSet *countedSet = [NSCountedSet new]; 

[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) 
         options:NSStringEnumerationByWords | NSStringEnumerationLocalized 
        usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ 

         // This block is called once for each word in the string. 
         [countedSet addObject:substring]; 

         // If you want to ignore case, so that "this" and "This" 
         // are counted the same, use this line instead to convert 
         // each word to lowercase first: 
         // [countedSet addObject:[substring lowercaseString]]; 
        }]; 

NSLog(@"%@", countedSet); 

Результаты:

"Это" - 2 "есть" - 2 "а" - 2 "тест" - 2 "только" - 1

+0

Спасибо ... Но этот термин не должен упоминаться вместе с вводом. Например, ввод setupsetpreset, и на выходе возвращается фраза «set» –

+0

, которую вы сказали, что хотите только подсчитать. И он вернет вам счет. –

+0

Я упомянул выход, возвращенный с помощью count –

1

После получать много пользовательских логики, чтобы получить общие символы в непространственной строке, я получил решение: -

NSString *[email protected]"setupsetpreset"; 
[email protected]"sheraheshehehesheshe"; 
NSMutableArray *a=[[NSMutableArray alloc] init]; 
NSMutableArray *b=[[NSMutableArray alloc] init]; 
for (int i=0; i<(string.length); i++) { 
    [a addObject:[NSString stringWithFormat:@"%c",[string characterAtIndex:i]]]; 
} 
NSCountedSet *countedSet = [NSCountedSet new]; 
[string enumerateSubstringsInRange:NSMakeRange(0, [string length]) 
          options:NSStringEnumerationByComposedCharacterSequences 
         usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop){ 
          [countedSet addObject:substring]; 
         }]; 
NSMutableArray *c=[[NSMutableArray alloc] init]; 
for (int i=0; i<(string.length); i++) { 
    if([countedSet countForObject:[a objectAtIndex:i]]>=2){ 
     if(![b containsObject:[a objectAtIndex:i]]){ 
      [c addObject:[NSString stringWithFormat:@"%d",(int)[countedSet countForObject:[a objectAtIndex:i]]]]; 
     } 
     [b addObject:[a objectAtIndex:i]]; 
    } 
} 

int total=0; 
for (NSString *s in c){ 
    int m=[s intValue]; 
    total+=m; 
} 
total=total/c.count; 
NSString *s=[b componentsJoinedByString:@""]; 
[c removeAllObjects]; 
for (int i=0; i<(s.length); i++) { 
    if([countedSet countForObject:[b objectAtIndex:i]]>=total){ 

     [c addObject:[b objectAtIndex:i]]; 
    } 
} 
s=[c componentsJoinedByString:@""]; 
int iterate=0; 
NSString *substring; 
NSMutableDictionary *dict=[[NSMutableDictionary alloc] init]; 
while (iterate<s.length-total) { 
    NSString *searchstring=[s substringWithRange:NSMakeRange(iterate, total)]; 
    if ([string rangeOfString:searchstring].location == NSNotFound) { 
    } else { 
      [dict setObject:[NSNumber numberWithInt:[[dict objectForKey:searchstring] intValue]+1] forKey:searchstring]; 
     } 
     iterate++; 
    } 
    [a removeAllObjects]; 
    [b removeAllObjects]; 
    a=[dict.allValues mutableCopy]; 
    b=[dict.allKeys mutableCopy]; 
    int max = [[a valueForKeyPath:@"@max.intValue"] intValue]; 
    NSInteger Aindex = [a indexOfObject:[NSNumber numberWithInt:max]]; 
    substring =[NSString stringWithFormat:@"%@",[b objectAtIndex:Aindex]]; 
    NSLog(@"Substring %@ is repeated %d times",substring,max); 

Надеется, что это помогает Ф.О. r кому нужна :) Спасибо Kiran за предоставленную мне логику, которая требуется как часть, и Ruchira для вашего запроса.

+0

Почему вы храните цифры с помощью строки? – trojanfoe

+0

Я храню числа внутри массива, чтобы получить тот же самый индекс NSArray, который считается подстрокой, в которой максимальный счетчик. –

+0

Почему бы не использовать 'NSNumber'? – trojanfoe

Смежные вопросы