Ios 奇怪的字典排序
我想做一种奇怪的字典分类。我有非唯一的值和键,得到类似的东西Ios 奇怪的字典排序,ios,objective-c,sorting,nsarray,nsdictionary,Ios,Objective C,Sorting,Nsarray,Nsdictionary,我想做一种奇怪的字典分类。我有非唯一的值和键,得到类似的东西 NSArray *counts = [@"1",@"2",@"2",@"3",@"6",@"10"]; NSArray *names =[@"Jerry",@"Marge",@"Jerry",@"Marge",@"Jen",@"Mark"]; 我想要的输出是一个降序列表,由具有唯一名称的计数组成。我不希望输出数组中的同一个人的值更低。输出应该是 sortedNames=[@"Mark",@"Jen",@"Marge",@"Jer
NSArray *counts = [@"1",@"2",@"2",@"3",@"6",@"10"];
NSArray *names =[@"Jerry",@"Marge",@"Jerry",@"Marge",@"Jen",@"Mark"];
我想要的输出是一个降序列表,由具有唯一名称的计数组成。我不希望输出数组中的同一个人的值更低。输出应该是
sortedNames=[@"Mark",@"Jen",@"Marge",@"Jerry"]
sortedCounts=[@"10",@"6",@"3",@"2"];
我真的很感谢你在这方面的帮助
NSMutableArray *userNameArray = [[NSMutableArray alloc] init];
NSMutableArray *countArray = [[NSMutableArray alloc] init];
for (NSDictionary *dict in bigDick) {
NSString *nameString =[dict objectForKey:@"Name"];
NSString *countString =[dict objectForKey:@"Count"];
NSInteger countInt = [countString integerValue];
NSNumber *countNumber =[NSNumber numberWithInt:countInt];
[userNameArray addObject:nameString];
[countArray addObject:countNumber];
}
NSArray *namesAscending =[[userNameArray reverseObjectEnumerator]allObjects];
NSArray *countsAscending=[[countArray reverseObjectEnumerator]allObjects];
// Put the two arrays into a dictionary as keys and values
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:countsAscending forKeys:namesAscending];
// Sort the first array
NSArray *sortedCountArray = [[dictionary allValues] sortedArrayUsingSelector:@selector(compare:)];
// Sort the second array based on the sorted first array
// NSArray *sortedNameArray= [dictionary objectsForKeys:sortedCountArray notFoundMarker:[NSNull null]];
NSMutableArray *nameArray =[[NSMutableArray alloc] init];
for (int i=1; i<sortedCountArray.count; i++) {
NSString *name = [dictionary allKeysForObject:sortedCountArray[i]];
if (sortedCountArray[i]!=sortedCountArray[i-1]) {
[nameArray addObject:name];
}
}
NSMutableArray*userNameArray=[[NSMutableArray alloc]init];
NSMutableArray*countArray=[[NSMutableArray alloc]init];
for(NSDictionary*dict在bigDick中){
NSString*nameString=[dict objectForKey:@“Name”];
NSString*countString=[dict objectForKey:@“Count”];
NSInteger countInt=[countString integerValue];
NSNumber*countNumber=[NSNumber numberwhithint:countInt];
[userNameArray addObject:nameString];
[countArray addObject:countNumber];
}
NSArray*namesAscending=[[userNameArray reverseObjectEnumerator]allObjects];
NSArray*countsAscending=[[countArray reverseObjectEnumerator]allObjects];
//将这两个数组作为键和值放入字典中
NSDictionary*dictionary=[NSDictionary dictionary WithObjects:countsAscending forKeys:namesAscending];
//对第一个数组排序
NSArray*sortedCountArray=[[dictionary allValues]SortedArray使用选择器:@selector(比较:)];
//根据排序后的第一个数组对第二个数组进行排序
//NSArray*sortedNameArray=[dictionary objectsForKeys:sortedCountArray notFoundMarker:[NSNull]];
NSMutableArray*nameArray=[[NSMutableArray alloc]init];
对于(int i=1;i一种旧方法是手动对数组进行数字排序,每次迭代搜索最大值,当找到最大值时,从最大值索引处的另一个向量中取名称,并将其移动到新向量中
max = counts[0];
counter = 0;
for (int i=0;i<counts.count;i++)
{
temp = counts[i];
if (max<temp)
max = temp;
counter = i;
}
[new_names addObject: [names objectAtIndex:counter]];
[new_numbers addObject: max];
[numbers removeObjectAtIndex: counter];
[names removeObjectAtIndex:counter];
max=counts[0];
计数器=0;
对于(inti=0;i试试这个
sortedArray = [yourArray sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
对数组排序后,使用以下命令删除重复项
NSOrderedSet *orderedSet = [NSOrderedSet orderedSetWithArray: sortedArray];
NSArray *arrayWithoutDuplicates = [orderedSet array];
你的问题在于你的算法设计,如果你在调试器中一次一行地通过它,你应该看到它做了什么以及哪里出错了
我们不是来为您编写代码的,但让我们看看我们是否可以通过算法的一个步骤来帮助您找到一种方法:
有用的事实:如果在字典中查找一个键,而该键不存在,则返回值将为nil
由此:您可以使用字典来跟踪您所看到的与迄今为止最高分数配对的姓名。您可以获得姓名、分数对,在字典中查找姓名-如果您获得nil
这是一个新的姓名和一个新的高分。如果它不是nil
这是当前已知的高分,因此您可以进行比较和更新
这是一个粗略的算法,让我们试试。在开始之前,我们先定义一些常量,而不是在任何地方都使用文本字符串。这样做的好处是,我们不会错误键入字符串,编译器会发现我们是否错误键入了常量名称。这些可以在文件级别或在方法中定义:
const NSString *kName = @"Name";
const NSString *kCount = @"Count";
现在来看代码,在某个方法中,我们需要一个字典:
NSMutableDictionary *highScores = [NSMutableDictionary new]; // a single dictionary rather than your two arrays
NSNumber *currentScore = highScores[nameString]; // get current high score for user, if any
现在像以前一样开始循环:
for (NSDictionary *dict in bigDict) // same loop as your code
{
NSString *nameString = dict[kName]; // same as your code, but using modern syntax
NSInteger countInt = [dict[kCount] integerValue]; // condense two lines of your code into one
并像前面一样提取两个值:
for (NSDictionary *dict in bigDict) // same loop as your code
{
NSString *nameString = dict[kName]; // same as your code, but using modern syntax
NSInteger countInt = [dict[kCount] integerValue]; // condense two lines of your code into one
现在,我们可以在字典中查找名称:
NSMutableDictionary *highScores = [NSMutableDictionary new]; // a single dictionary rather than your two arrays
NSNumber *currentScore = highScores[nameString]; // get current high score for user, if any
如果名称作为键存在,这将返回当前关联的值-在这种情况下的分数,如果没有匹配的键,这将返回nil
。如果,我们可以在单个中进行测试:
if (currentScore == nil // not seen user before, no high score
|| currentScore.integerValue < countInt) // seen user, countInt is greater
{
和两个大括号,用于终止if
和for
:
}
}
让我们看看我们有什么:
NSLog(@"Output: %@", highScores);
这将产生:
Output: {
Jen = 6;
Jerry = 2;
Marge = 3;
Mark = 10;
}
这是正确的一步。(注意:字典没有排序,NSLog
只是按排序顺序显示键。)
确保你理解为什么这样做,复制代码并测试它。然后尝试设计算法的下一阶段
如果你陷入困境,你可以问一个新问题,显示你开发的算法和代码,有人可能会帮助你。如果你这样做,你应该包括一个指向这个问题的链接,这样人们可以看到历史记录(并且知道你不是想通过多个问题为你编写应用程序!)
HTH为什么是字典?为什么不是自定义对象数组?您编写过过滤器吗?这个问题太广泛了…先排序,然后删除重复项。您尝试过什么吗?如果是,您遇到了什么问题?未识别的选择器发送到NSNumber实例这是编译器通常会告诉您的。