1

いくつかの文字列を含む配列があります。文字列の各文字には、整数値が割り当てられます。たとえば、a=2、b=5、c=6、o=1、k=3 など

文字列の最終値は、文字の値の合計です。たとえば、文字列「BOOK」の場合、文字列は「BOOK (7)」として格納されます。同様に、すべての文字列は最終的な整数値を持ちます。これらの配列を、各配列インデックスに存在する文字列に格納されたこれらの最終整数値でソートしたいと思います。配列には 200,000 を超える単語が含まれています。したがって、ソートプロセスはかなり高速になるはずです。そのための方法はありますか?

4

4 に答える 4

1

残忍な簡単な例は、「Book (7)」のように文字列構造が常に同じである場合、「()」の間の数字を見つけることで文字列を操作し、辞書を使用して一時的に保存することができます。オブジェクト:

    NSMutableArray *arr=[NSMutableArray arrayWithObjects:@"Book (99)",@"Pencil (66)",@"Trash (04)", nil];
    NSLog(@"%@",arr);

    NSMutableDictionary *dict=[NSMutableDictionary dictionary];
    //Find the numbers and store each element in the dictionary 
    for (int i =0;i<arr.count;i++) {
        NSString *s=[arr objectAtIndex:i];
        int start=[s rangeOfString:@"("].location;
        NSString *sub1=[s substringFromIndex:start];
        NSString *temp1=[sub1 stringByReplacingOccurrencesOfString:@"(" withString:@""];
        NSString *newIndex=[temp1 stringByReplacingOccurrencesOfString:@")" withString:@""];
        //NSLog(@"%d",[newIndex intValue]);
        [dict setValue:s forKey:newIndex];
    }
    //Sorting the keys and create the new array
    NSArray *sortedValues = [[dict allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
    NSMutableArray *newArray=[[NSMutableArray alloc]init];
    for(NSString *valor in sortedValues){
               [newArray addObject:[dict valueForKey:valor]];
        }
    NSLog(@"%@",newArray);

これは以下を出力します:

(
"本 (99)"、
"鉛筆 (66)"、
"ゴミ箱 (04)"
)

(
"ゴミ箱 (04)"、
"鉛筆 (66)"、
"本 (99)"
)

于 2012-11-03T10:43:52.177 に答える
0

私が理解しているように、次のようにフォーマットされた文字列を含む配列をソートしたい

a=3

文字を無視して数字でソートしたい。この場合、次のコードが機能します

-(NSArray *)Sort:(NSArray*)myArray
{
    return [myArray sortedArrayUsingComparator:(NSComparator)^(id obj1, id obj2)
            {
                NSString *first = [[obj1 componentsSeparatedByString:@"="] objectAtIndex:1];
                NSString *second = [[obj2 componentsSeparatedByString:@"="] objectAtIndex:1];
                return [first caseInsensitiveCompare:second];
            }];
}

それの使い方:

NSArray *arr= [[NSArray alloc] initWithObjects:@"a=3",@"b=1",@"c=4",@"f=2", nil];
NSArray *sorted = [self Sort:arr];

for (NSString* str in sorted)
{
    NSLog(@"%@",str);
}

出力

b=1
f=2
a=3
c=4
于 2012-11-03T10:22:46.623 に答える
0

この方法を試してください

+(NSString*)strTotalCount:(NSString*)str
{
   NSInteger totalCount =  0;
   // initial your character-count directory
   NSDictionary* characterDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithInt:2], [NSString stringWithUTF8String:"a"],
    [NSNumber numberWithInt:5], [NSString stringWithUTF8String:"b"],
    [NSNumber numberWithInt:6], [NSString stringWithUTF8String:"c"],
    [NSNumber numberWithInt:1], [NSString stringWithUTF8String:"o"],
    [NSNumber numberWithInt:3], [NSString stringWithUTF8String:"k"],
                                   nil];

   NSString* tempString = str;
  for (NSInteger i =0; i<tempString.length; i++) {
    NSString* character  = [tempString substringWithRange:NSMakeRange(i, 1)];
    character = [character lowercaseString];
    NSNumber* count = [characterDictionary objectForKey:character];
    totalCount += [count integerValue];
  };
  return [NSString stringWithFormat:@"%@(%d)",str,totalCount];
}

テスト文:

 NSLog(@"%@", [ViewController strTotalCount:@"BOOK"]);

「 BOOK(10) 」を出力します

ViewController を独自のクラス名に変更できます。

于 2012-11-03T10:23:22.597 に答える
0

まず、カスタム オブジェクトを作成して値を保存します。文字列内に値を入れないでください。並べ替えは基本的な問題ではありません。問題は、抽出が困難な場所から値を文字列に保存していることです。

@interface StringWithValue

@property (nonatomic, copy, readwrite) NSString* text;
@property (nonatomic, assign, readwrite) NSUInteger value;

- (id)initWithText:(NSString*)text;

- (NSComparisonResult)compare:(StringWithValue*)anotherString;

@end

@implementation StringWithValue

@synthesize text = _text;
@synthesize value = _value;

- (id)initWithText:(NSString*)text {
    self = [super init];

    if (!self) {
       return nil;
    }

    self.text = text;
    self.value = [self calculateValueForText:text];

    return self;
}

- (NSComparisonResult)compare:(StringWithValue*)anotherString {
   if (self.value  anotherString.value) {
      return NSOrderedDescending;
   }
   else {
      return NSOrderedSame;
   }
}

- (NSString*)description {
    return [NSString stringWithFormat:@"%@ (%u)", self.text, self.value];
}

@end

配列の並べ替えは、sortUsingSelector:. すべての比較で値を解析する必要がないため、これは他のすべての回答よりもパフォーマンスが優れていることに注意してください。

于 2012-11-03T11:33:31.623 に答える