1

Objective-C で NSString のリスト (NSArray) をコンマで区切られた単一の NSString に結合する最も簡単で最良の方法は何ですか?

NSArray *anArray = [NSArray arrayWithObjects:@"milk", @"butter", @"eggs", @"spam", nil];

この配列から、 NSString が必要です@"milk, butter, eggs, and spam"

より一般的には、リストが 3 つ以上の", "アイテムである場合、最後と最後から 2 番目のアイテムを除くすべてのアイテムの間に必要です (これには が必要", and "です)。リストが 2 項目の長さの場合、' and 'コンマなしで だけが必要です。リストが 1 項目の長さの場合、配列から単一の文字列が必要です。

私は次のようなシンプルなものが好きです:

NSString *newString = [anArray componentsJoinedByString:@", "];

しかし、これはもちろん「and」接続詞を省略しています。

以下よりも簡単かつ/または高速なObjective-Cの方法はありますか:

- (NSString *)grammaticallyCorrectStringFromArrayOfStrings:(NSArray *)anArray {
    if (anArray == nil) return nil;
    int arrayCount = [anArray count];
    if (arrayCount == 0) return @"";
    if (arrayCount == 1) return [anArray objectAtIndex:0];
    if (arrayCount == 2) return  [anArray componentsJoinedByString:@" and "];

    // arrayCount > 2
    NSString *newString = @"";
    for (NSString *thisString in anArray) {
        if (thisString != [anArray objectAtIndex:0] && thisString != [anArray lastObject]) {
            newString = [newString stringByAppendingString:@", "];
        }
        else if (thisString == [anArray lastObject]) {
            newString = [newString stringByAppendingString:@", and "];
        }
        newString = [newString stringByAppendingString:thisString];
    }
    return newString;
}
4

1 に答える 1

2

ループについては、おそらく次のようなことをします

NSMutableString *newString = [NSMutableString string];
NSUInteger lastIndex = arrayCount - 1;
[anArray enumerateObjectsUsingBlock:^(NSString *thisString, NSUInteger idx, BOOL *stop) {
    if (idx != 0)
        [newString appendString:@","];
    if (idx == lastIndex)
        [newString appendString:@" and "];

    [newString appendString:thisString];
}];

それは本当に少ない行ではないと思いますが。

于 2012-09-13T13:21:34.533 に答える