NSDictionary allKeys订单

时间:2013-07-19 11:38:25

标签: ios nsdictionary

我需要在UITableView中显示API返回的NSDictionary的内容,并遵守键的顺序。

我正在使用:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        NSString *key = self.data.allKeys[indexPath.section];
        NSArray *list = self.data[key];
        id data = list[indexPath.row];

        PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView];

        cell.model = data;

        return cell;
}

但正如我self.data.allKeys,我正在失去我的钥匙的顺序。我不能按价值对它们进行排序,因为它与它们无关。

4 个答案:

答案 0 :(得分:24)

试试这个,

NSArray *keys = [myDictionary allKeys];
keys = [keys sortedArrayUsingComparator:^(id a, id b) {
    return [a compare:b options:NSNumericSearch];
}];

NSLog(@"%@",keys);

现在根据已排序的密钥获取值。

修改

要按字母顺序对它们进行排序,请尝试使用

NSArray *keys = [myDictionary allKeys];
keys = [[keys mutableCopy] sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

NSLog(@"%@",keys);

答案 1 :(得分:1)

正如大家所说,我无法订购我的NSDictionary日志中出现的密钥,因为没有订购NSDictionary。

我要求API中的人返回一个数组:

0 => name : key 1
     value : value 1

1 => name : key 2
     value : value 2

/ ------------------------------------------- --------------------------------- /

太糟糕了,没有像这样使用的方法“sortedArrayUsingArray”:

NSArray * arrayOne = [@"key E", @"key A", @"key C"];

NSArray * arrayTwo = [@"key A", @"key B", @"key C", @"key D", @"key E", @"key F"];

NSArray * orderedArray = [arrayOne sortedArrayUsingArray: arrayTwo];

答案 2 :(得分:0)

我编写了一个快速方法来获取源数组(对象全部乱序)和一个引用数组(具有所需(和完全任意)顺序的对象),并返回一个数组所在的数组已重新组织源数组以匹配引用数组。

- (NSArray *) reorderArray:(NSArray *)sourceArray toArray:(NSArray *)referenceArray
{
    NSMutableArray *returnArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < [referenceArray count]; i++)
    {
        if ([sourceArray containsObject:[referenceArray objectAtIndex:i]])
        {
            [returnArray addObject:[arrReference objectAtIndex:i]];
        }
    }
    return [returnArray copy];
}

请注意,这非常脆弱。它使用NSArray的{​​{1}}方法,最终将调用NSObject's isEqual:。基本上,它应该适用于containsObject: s,NSString s和NSNumber s(尚未尝试过那个)的数组,但除此之外,YMMV。我想如果你试图传递NSDate s或其他一些非常复杂的对象的数组,那么它本身就会完全失败,并且会崩溃或返回总垃圾。同样,如果您要执行诸如传递UITableViewCell s数组作为参考数组和NSDate s数组作为源数组。此外,如果源数组包含引用数组中未涵盖的项,则它们将被丢弃。可以通过添加一些额外的代码来解决其中一些问题。

所有这一切,如果你想做一些简单的事情,它应该很好地工作。在您的情况下,您只需从您作为源数组发布的答案发送NSString,并将arrayOne作为参考数组发送。

答案 3 :(得分:0)

你说你丢失了按键的顺序,所以我想你从NSArray中取出这些按键。对?在那个NSArray中,你可以根据需要订购钥匙。而且我也看到NSDictionary的对象是Arrays,对吧?是。所以在你的Ordered Array中你有更多阵列。

data是NSDictionary的名称。

所以,你要做的就是将NSArray(按照你一直想要的那个)带到这个.m文件中,然后在你的cellForRowAtIndexPath方法中使用一些很棒的代码。您可以通过执行以下操作来完成此操作:

@interface yourViewController ()
{
    NSArray *yourArrayOrdered;
}
@end

@implementation yourViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    yourArrayOrdered = [[NSArray alloc] initWith...:... ];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
    NSString *key = yourArrayOrdered[indexPath.row];
    NSArray *list = [self.data objectForKey:yourArrayOrdered[indexPath.row]];

    //your code continues here...

    /*id data = list[indexPath.row]; //don't think you need this line

    PSSearchCell *cell = [PSSearchCell newCellOrReuse:tableView];

    cell.model = data; */

    return cell;
}

这就是你需要做的就是使用NSDictionary和NSArray保持你想要的顺序。

为了更好地可视化,如果您的有序数组只包含字符串,它将是这样的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath      *)indexPath
{
    NSString *key = yourArrayOrdered[indexPath.row];

    NSString *myString = [self.data objectForKey:yourArrayOrdered[indexPath.row]];

    cell.textLabel.text = [NSString stringWithFormat:@"THIS IS THE OBJECT %@", myString];

    cell.detailTextLabel.text = [NSString stringWithFormat:@"AND THIS IS THE KEY %@", key];

    return cell;
}

希望它有所帮助。