2

プログラムがユーザー入力から受け取る日 (文字列形式) の配列があり、その長さは 1 ~ 7 です。受信した配列には、曜日名がフルテキストで含まれています。

受け取る可能性のある配列の例は次のとおりです。["Tuesday", "Monday", "Thursday"]

私がやろうとしているのは、この配列を並べ替えてMonday to Sunday、全文名を略語に変換することです。したがって、上記の配列の並べ替え関数は、理想的には次を返します["M", "Tu", "Th"]

同じ日の重複は表示されず、アイテムが 1 つ未満になることも、7 つを超えることもありません。

ありがとう。

大雑把ですが、これはユーザーが日を選択する大まかな UI です。

ここに画像の説明を入力

選択した回答を使用しましたが、必要な場所に追加するだけに調整しました。私はそれを次のように適応させました:

-(NSArray*)array:(NSArray*)array collect:(id(^)(id object))block
{
    NSMutableArray * result = [ NSMutableArray array ] ;
    for( id object in array ) { [ result addObject:block( object) ] ; }
    return result ;
}

-(NSArray*)arrayBySortingAndAbbreviatingDayNames:(NSArray*)arrayToSort
{
    NSArray * dayNames = @[ @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday",     @"Saturday", @"Sunday" ] ;
    NSArray * abbreviations = @[ @"M", @"Tu", @"W", @"Th", @"F", @"Sa", @"Su" ] ;
    NSArray * array = [ self array:arrayToSort collect:^(NSString * dayName){
        return @([ dayNames indexOfObject:dayName ]) ;
    } ] ;
    array = [ array sortedArrayUsingSelector:@selector( compare: ) ] ;
    array = [ self array:array collect:^(NSNumber * index){
        return abbreviations[ [ index integerValue ] ] ;
    }];
    return array ;
}
4

2 に答える 2

3

同じことを行う別の方法を次に示します。

NSArray *input = @[@"Tuesday",@"Friday",@"Wednesday",@"Saturday"];

NSArray *dayArray = @[@{@"Monday":@"M"},@{@"Tuesday":@"Tu"},@{@"Wednesday":@"W"},@{@"Thursday":@"Th"},@{@"Friday":@"F"},@{@"Saturday":@"Sa"},@{@"Sunday":@"Su"}];
NSMutableArray *output = [@[@"",@"",@"",@"",@"",@"",@""] mutableCopy];
for (NSString *aDay in input) {
    NSInteger indx = [dayArray indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        return [[dayArray[idx] allKeys][0] isEqualToString:aDay];
    }];
    [output replaceObjectAtIndex:indx withObject:dayArray[indx][aDay]];
}
[output removeObjectIdenticalTo:@""];
NSLog(@"%@",output);
于 2013-05-14T01:51:02.827 に答える
3
@implementation NSArray (DayNameThing)

-(NSArray*)collect:(id(^)(id object))block
{
    NSMutableArray * result = [ NSMutableArray array ] ;
    for( id object in self ) { [ result addObject:block( object) ] ; }
    return result ;
}

-(NSArray*)arrayBySortingAndAbbreviatingDayNames
{
    NSArray * dayNames = @[ @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday" ] ;
    NSArray * abbreviations = @[ @"M", @"Tu", @"W", @"Th", @"F", @"Sa", @"Su" ] ;
    NSArray * array = [ self collect:^(NSString * dayName){
        return @([ dayNames indexOfObject:dayName ]) ;
    } ] ;
    array = [ array sortedArrayUsingSelector:@selector( compare: ) ] ;
    array = [ array collect:^(NSNumber * index){
        return abbreviations[ [ index integerValue ] ] ;
    }];
    return array ;
}

@end

そう...ユーザーが選択した曜日名がある場合、 ..arrayで必要な結果を得ることができますnewArray = [ array arrayBySortingAndAbbreviatingDayNames ]


はるかに優れた/より簡単な方法を編集して考えました:

NSArray * convertArray(NSArray * input)
{
    NSArray * dayNames = @[ @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday" ] ;
    NSArray * shortDayNames = @[ @"M", @"Tu", @"W", @"Th", @"F", @"Sa", @"Su" ] ;
    NSMutableArray * output = [ NSMutableArray array ] ;
    for( int index=0; index < 7; ++index )
    {
        if ( [ input containsObject:dayNames[ index ]] )
        {
            [ output addObject:shortDayNames[ index ]] ;
        }
    }
    return output ; 
}

さらに良く編集します。

NSArray * ConvertArray(NSArray * input)
{
    NSArray * dayNames = @[ @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", @"Sunday" ] ;
    NSArray * shortDayNames = @[ @"M", @"Tu", @"W", @"Th", @"F", @"Sa", @"Su" ] ;

    return [ shortDayNames objectsAtIndexes:[ dayNames indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
        return [ input containsObject:obj ] ;
    }]] ;
}

...わかりました、私は終わったと思います。:)

于 2013-05-14T01:22:43.463 に答える