首页 > 解决方案 > 只允许分隔有限类型的对象

问题描述

目前,我混合了不同货币的对象:

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;
}

标签: iosobjective-csorting

解决方案


您可以使用 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];
    }
}

推荐阅读