Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 根据单独的数组对字典数组进行排序?_Ios_Objective C_Sorting_Nsdictionary_Keyvaluepair - Fatal编程技术网

Ios 根据单独的数组对字典数组进行排序?

Ios 根据单独的数组对字典数组进行排序?,ios,objective-c,sorting,nsdictionary,keyvaluepair,Ios,Objective C,Sorting,Nsdictionary,Keyvaluepair,我有点奇怪的问题。所以我有一系列字典说 ( Dict 1: "Name" = "B" "Number" = "2" Dict 2: "Name" = "A" "Number" = "1" Dict 3: "Name" = "D" "Number" = "4" Dict 4: "Name" = "C" "Number" = "3" Dict 5 "Name" = "E" "Number" = "5" ) 假设我有一个数组: ( "1" "4" "2" ) 如何获得一个数组,该数组包含所

我有点奇怪的问题。所以我有一系列字典说

(
Dict 1:
"Name" = "B"
"Number" = "2"

Dict 2:
"Name" = "A"
"Number" = "1"

Dict 3:
"Name" = "D"
"Number" = "4"

Dict 4:
"Name" = "C"
"Number" = "3"

Dict 5
"Name" = "E"
"Number" = "5"
)
假设我有一个数组:

(
"1"
"4"
"2"
)
如何获得一个数组,该数组包含所有字典,其“Number”键与该数组中的每个对象匹配,并根据第二个数组对其进行排序

e、 g.产出将是

(
Dict 1:
"Name" = "A"
"Number" = "1"

Dict 2:
"Name" = "D"
"Number" = "4"

Dict 3:
"Name" = "B"
"Number" = "2"
)
我想我可以使用描述符使用
sortedarray,但我不确定如何指定多个描述符。描述符能否包含数组中的每个对象?

非常感谢您提供的任何帮助或指导。

这与排序无关,特别是因为数组中的每一本词典都没有涉及。您要做的是从数组中提取每个字典

如果你根本没有一系列字典,这会简单得多。相反,您应该从一个大字典开始,其中键是数字,值是任意值(可能是整个字典,可能只是名称)。现在你只需在字典中查找每个数字作为键,然后抓取名称

{ 1 => A, 2 => B, 3 => C ...}

现在只需抓取
objectForKey:@1
objectForKey:@4
objectForKey:@2
,您就完成了。

以下是答案。这里我使用了枚举器,它更快

NSArray * dicArray = @[@{@"Name": @"B",@"Number":@"2"},
                       @{@"Name": @"A",@"Number":@"1"},
                       @{@"Name": @"D",@"Number":@"4"},
                       @{@"Name": @"C",@"Number":@"3"},
                       @{@"Name": @"E",@"Number":@"5"}];
NSArray * indArray = @[@(1),@(4),@(2)];

NSMutableArray * resultArray = [NSMutableArray arrayWithCapacity:indArray.count];
[indArray enumerateObjectsUsingBlock:^(NSNumber* SearchValue, NSUInteger idx, BOOL *stop) {

    //search dicArray for object, which match your condition (i.e Number value == obj value)
    NSInteger index = [dicArray indexOfObjectPassingTest:^BOOL(NSDictionary* obj, NSUInteger idx, BOOL *stop) {
        return ([(NSString *)obj[@"Number"] integerValue] == SearchValue.integerValue)? YES : NO;
    }];

    resultArray[idx] = dicArray[index];
}];

NSLog(@"%@",resultArray);
所以我想出来了。 基本上我使用嵌套循环

这是代码。这可能需要很长时间,具体取决于每个区域中有多少对象。对我来说,每个物体大约有30个,所以大约需要50毫秒:

NSMutableArray *finalArray = [NSMutableArray array];
for (NSString *keyName in keyArray) {
    NSString *fname;
    for (NSDictionary *dict in dictArray) {
        fname = [dict objectForKey:@"theKey"];
        if ([fname isEqualToString:keyName])
            [finalArray addObject:dict];
    }
}

这样做怎么样?分两步:1。使用键=数字2对原始词典排序。对于数组{1,4,2..}中的每个数字,在已排序的字典中进行b搜索,如果找到,则打印该条目复杂性的详细信息=O(mlogm+nlogm)m=字典大小,n=查询数组大小h但此处不清楚,您的字典是否有两个相同编号的条目?例如:Dict 1{Name=A,number=1}Dict 2{Name=B,number=1}如果是,那么当您的查询数组中有1时,我应该同时打印这两个吗?@shole您所说的B搜索是什么意思?你的意思是排序数组而不是字典吗?@shole不,数字键中不会有重复项。我是说二进制搜索,你能重新排序你的字典,使它与数字一起升序吗?例如,我可以制作成对数组[(1,2)、(2,1)、(3,4)、(4,3)、(5,5)],其形式为(dictd,Number),然后将其重新排序为[(2,1)、(1,2)、(4,3)、(3,4)、(5,5)]。最后只需对每个查询进行二进制搜索,比如查询{1,4,2},我可以分别找到(2,1),(3,4),(1,2),所以你知道应该将Dict2,Dict3,Dict1打印为输出..我从一个JSON请求中提取,得到一个字典数组。不幸的是,这对我不起作用+但是我不同意。你可以根据你得到的数据制作我正在描述的字典!您应该这样做,正是为了方便您打算进行的查找。聪明,嗯?这种为了方便某种查找而进行的重新调整是完美的标准行为。是的,我同意这是一种聪明的方法。我看看我能做什么。
for (NSNumber *aNumber in testArray) {
    for (NSDictionary *aDict in anArray) {
        if (aNumber.intValue == [(NSNumber *)[aDict valueForKey:@"Number"]intValue]) {
            [finalArray addObject:aDict];
        }
    }
}