テキストを単語に分けて、いちばん長い単語を抽出
形態素解析といえばいろいろありますが、Objective-Cのみでもできると知ってびっくり。
ここを参考にしました。ありがとうございます!
で、whileで出て来る結果を配列に格納していちばん長い単語を取り出してみました。変更個所だけ書くとヤヤコシイので、変更していない箇所もそのまま載せます。
・ViewController.h
#import <UIKit/UIKit.h> @interface ViewController : UIViewController { //何回ループが回ったか=どれだけ配列の個数が必要か調べる数 int count; } ...
・ViewController.m
... - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. count = 0; //トークン解析に必要なもの NSString * testString; CFLocaleRef locale; // ロケール:tokenizer生成に使用 CFRange range; // 解析用範囲:tokenizer生成に使用 : のちに検知されたトークンの範囲用として使用 {//トークン解析に必要なもの:初期化 testString = @"ほむほむマジほむほむ"; range = CFRangeMake(0, [testString length]); locale = CFLocaleCopyCurrent();// !!!: 要CFRelease } //トークン解析してくれる子 CFStringTokenizerRef tokenizer; // トークン解析してくれるよ !!!: 要CFRelease tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, (CFStringRef)CFBridgingRetain(testString), range, kCFStringTokenizerUnitWordBoundary, locale); CFStringTokenizerTokenType tokenType; // 見つかったトークンの状態 // 最初に見つかったトークンの状態で初期化 tokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0); NSMutableArray *persistentArray = [NSMutableArray array]; //トークン毎ループ while (tokenType != kCFStringTokenizerTokenNone) { // // range を解析用範囲から見つかったトークンの範囲へと使用方法を変更 // //配列の個数=何回ループしたか count = count + 1; range = CFStringTokenizerGetCurrentTokenRange(tokenizer); //出力結果 NSString *relustStr = [testString substringWithRange:NSMakeRange(range.location, range.length)]; NSLog(@"%@",relustStr); //解析結果から配列を作成 [persistentArray addObject:relustStr]; tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer); } //1番目の要素を取り出す //NSString *str = [persistentArray objectAtIndex:0]; NSArray *strSort = [NSMutableArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"length" ascending:NO]]; //並べ替える NSArray *resultSort = [persistentArray sortedArrayUsingDescriptors:strSort]; //最も長い文字列を取り出す NSString *resultStrS = [resultSort objectAtIndex:0]; NSLog(@"いちばん長い = %@",resultStrS); CFRelease(locale); CFRelease(tokenizer); } ...