Разрешить разделение только ограниченного типа объектов - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время у меня есть смесь объектов разных валют:

NSArray *currencies = @[ @"USD",@"USD",@"USD",@"USD", @"EUR",@"EUR",@"EUR",@"EUR", @"PHP",@"PHP",@"PHP",@"PHP", @"AUD",@"AUD",@"AUD",@"AUD"];

и мой код разделяет эти объекты в их различные соответствующие массивы, в результате чего будет:

USD[] = [USD , USD , USD ,USD]

PHP[] = [PHP , PHP , PHP]

EUR[] = [EUR , EUR , EUR]

AUD[] = [AUD, AUD , AUD].

Проблема в том, что я хочу разделить только доллары США и PHP, а остальные валюты должны быть в одном массиве. как это:

USD[] = [USD , USD , USD ,USD]

PHP[] = [PHP , PHP , PHP]

OTHER[] = [EUR,EUR,EUR,EUR,AUD,AUD,AUD]

мой текущий код такой:

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSArray *currencies = @[ @"USD", @"EUR", @"PHP", @"AUD" ];
        NSMutableArray<AccountBalance *> *allAccounts = [NSMutableArray new];

        int numOdDummyAccounts = 100;
        for (int i=0;i<numOdDummyAccounts;i++) {
            int currencyIdx = rand() % [currencies count];
            AccountBalance *dummyBalance = [AccountBalance new];
            [dummyBalance setCurrency:currencies[currencyIdx]];

            [allAccounts addObject:dummyBalance];
        }

        // print out all currencies
        for (int i=0;i<numOdDummyAccounts;i++) {
            NSLog(@"%@", [allAccounts[i] getCurrency]);
        }

        ////////////////////////////////////////////////////////////////

        // now do the sorting
        NSMutableDictionary<NSString *, NSMutableArray *> *groupedResult = [NSMutableDictionary new];
        [allAccounts enumerateObjectsUsingBlock:^(AccountBalance * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            NSMutableArray *currencyArray = [groupedResult objectForKey:[obj getCurrency]];
            if (currencyArray) {
                [currencyArray addObject:obj];
            } else {
                NSMutableArray *newCurrencyArray = [NSMutableArray new];
                [newCurrencyArray addObject:obj];
                [groupedResult setObject:newCurrencyArray forKey:[obj getCurrency]];
            }
        }];

        // print out all grouped currencies
        NSMutableArray<NSMutableArray *> *arrayOfArrays = [NSMutableArray new];
        for (NSString *currency in groupedResult.allKeys) {
            NSMutableArray *currentCurrency = [groupedResult objectForKey:currency];
            [arrayOfArrays addObject:currentCurrency];
            NSLog(@"Accounts with currency %@: ", currency);

            // print out all accounts with this currency
            for (int i=0;i<[currentCurrency count];i++) {
                NSLog(@"%@", [currentCurrency[i] getCurrency]);
            }
        }


    }
    return 0;
}

1 Ответ

0 голосов
/ 07 сентября 2018

Вы можете использовать NSPredicate, чтобы сделать вещи простыми и понятными, как это: -

NSArray *unFilteredCurrencies = @[ @"USD",@"USD",@"USD",@"USD", @"EUR",@"EUR",@"EUR",@"EUR", @"PHP",@"PHP",@"PHP",@"PHP", @"AUD",@"AUD",@"AUD",@"AUD" ];

NSString  * kUsd = @"USD";
NSString  * kPhp = @"PHP";

NSArray *usd    = [unFilteredCurrencies filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(SELF == %@)",kUsd]];
NSArray *php    = [unFilteredCurrencies filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(SELF == %@)",kPhp]];
NSArray *ohters = [unFilteredCurrencies filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(SELF != %@ && SELF != %@)",kUsd,kPhp]];

Или чтобы понять больше, или вы хотите свое собственное решение, вы можете создать такую ​​функцию, как: -

-(NSMutableDictionary *)updateDictionary:(NSMutableDictionary *)dictionary value:(NSString *)value forKey:(NSString *)key{
    if (dictionary[key]) {
        NSMutableArray *addedCurrencies =dictionary[key];
        [addedCurrencies addObject:value];
        dictionary[key] = addedCurrencies;
    }else{
        NSMutableArray *addCurrency = @[value].mutableCopy;
        dictionary[key] = addCurrency ;
    }
    return dictionary;
}

И назовите его в вашем методе как: -

NSArray *unFilteredCurrencies = @[ @"USD",@"USD",@"USD",@"USD", @"EUR",@"EUR",@"EUR",@"EUR", @"PHP",@"PHP",@"PHP",@"PHP", @"AUD",@"AUD",@"AUD",@"AUD" ];
NSMutableDictionary * filteredCurrencies = [NSMutableDictionary new];
NSString  * kUsd = @"USD";
NSString  * kPhp = @"PHP";
NSString  * kOther = @"Other";
for (NSString *string in unFilteredCurrencies){
    if ([string isEqualToString:kUsd]){
        filteredCurrencies = [self updateDictionary:filteredCurrencies value:string forKey:kUsd];
    }else if([string isEqualToString:kPhp]){
        filteredCurrencies = [self updateDictionary:filteredCurrencies value:string forKey:kPhp];
    }else{
        filteredCurrencies = [self updateDictionary:filteredCurrencies value:string forKey:kOther];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...