ios - 只允许分隔有限类型的对象
问题描述
目前,我混合了不同货币的对象:
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;
}
解决方案
您可以使用 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];
}
}
推荐阅读
- java - Apache气流任务:java:找不到命令
- python-3.x - Tkinter Scale 小部件——连续操作
- android - JaCoCo Gradle - 排除类并覆盖包含
- r - 创建新列,该列采用另一列值的总和并按 R 中的条件分组
- postgresql - 整数的输入语法无效,但类型是日期?
- json - Spring webflux Netty(无tomcat):如何在不重复代码的情况下将proto公开为json端点?
- assembly - 如何设置不闪烁的文本光标(程序集)?
- java - Weblogic 通过 Keytool 导入 SSL .PFX 文件
- java - Spring Boot 自动装配:属性值被填充的奇怪情况
- google-cloud-platform - 谷歌云平台