0

人間が読める配列の文字列表現を提供するメソッドを作成したいと思います。必要に応じてコンマ スペース (Oxford Comma を含む) を使用し、最後に " と " を結合します。

たとえば、次の配列があるとします。

NSArray *nun = @[];
NSArray *won = @[@"The Loneliest"];
NSArray *too = @[@"Peas", @"Pod"];
NSArray *tree = @[@"Apple", @"Falls", @"Far, Far Away"];

次のようなメソッドを書きたい:

+ (NSString*) humanReadableListFromArray: (NSArray*) arr
{
  // magic
}

配列を渡すときは、次のように表示します。

@""
@"The Loneliest"
@"Peas and Pod"
@"Apple, Falls, and Far, Far Away"

ちょうど 1 itemを持つ最初のものは、装飾のない最初のアイテムであることに注意してください。2 つ目は、正確に 2 つの項目があり、カンマはありませんが、" と " の結合があります。3 つ目は 3 つ以上の項目があり、各項目の間にコンマ スペースが含まれ、最後の項目にはandコンマ スペースの直後と項目の前に追加の項目が含まれます。

Objective Cでこれを行う簡単な方法はありますか? 私は Java のような言語でこれを行ってきましたが、Objective C には-(NSString*)[NSArray componentsJoinedByString:]、これに役立つようなメソッドが備わっていることを知っています。


この質問は、文字列の最後のコンマを「and」に置き換えることによって回答されません。(Objective-C)配列の最後の項目のカンマに対応していないためです。Objective-C Simplest way to create comma Separated string from an array of objects のような質問も調べましたが、人間の読みやすさのこの素晴らしい部分については触れていません。

4

5 に答える 5

6

サードパーティのライブラリ @timgcarlson が言及していることは有望に思えます。これが私がネイティブに行うことです...

- (NSString *)humanReadableListFromArray:(NSArray *)array withOxfordStyle:(BOOL)oxford {
    if (array.count == 0) return @"";
    if (array.count == 1) return array[0];
    if (array.count == 2) return [array componentsJoinedByString:@" and "];

    NSArray *firstItems = [array subarrayWithRange:NSMakeRange(0, array.count-1)];
    NSString *lastItem = [array lastObject];
    NSString *lastDelimiter = (oxford)? @", and " : @" and ";
    return [NSString stringWithFormat:@"%@%@%@",
        [firstItems componentsJoinedByString:@", "], lastDelimiter, lastItem];
}
于 2015-07-08T18:40:46.483 に答える
3

TTTFormatterKitにはまさに必要なものがあります。

プロジェクトの README の例を次に示します...

NSArray *list = [NSArray arrayWithObjects:@"Russel", @"Spinoza", @"Rawls", nil];
TTTArrayFormatter *arrayFormatter = [[TTTArrayFormatter alloc] init];
[arrayFormatter setUsesSerialDelimiter:NO]; // Omit Oxford Comma
NSLog(@"%@", [arrayFormatter stringFromArray:list]); // "Russell, Spinoza and Rawls"
于 2015-07-08T18:35:34.397 に答える