【问题标题】:How would I use an NSMutableArray with a NSMutableDictionary我如何将 NSMutableArray 与 NSMutableDictionary 一起使用
【发布时间】:2013-05-07 20:12:11
【问题描述】:

我有一个 NSMutableDictionary 网站

[dictionaryOfSites setObject:@"http://www.example.com" forKey:@"Example.com"];
[dictionaryOfSites setObject:@"http://www.site1.com" forKey:@"Site1"];
[dictionaryOfSites setObject:@"http://www.apple.com" forKey:@"Apple"];

我知道你不能对字典进行排序。但是我读到其他人使用了 NSMutableArray 作为键,并且可以对数组进行排序。

所以如果我设置一个新数组

[[arrayKey alloc] initWithObjects:@"Example.com", @"Site1", @"Apple", nil];

然后我会将我的第一个 sn-p 修改为

[dictionaryOfSites setObject:@"http://www.example.com" forKey:[arrayForKey objectAtIndex:0]];
[dictionaryOfSites setObject:@"http://www.site1.com" forKey:[arrayForKey objectAtIndex:1]];
[dictionaryOfSites setObject:@"http://www.apple.com" forKey:[arrayForKey objectAtIndex:2]];

在这个简单的问题中,我有 3 个站点,所以我对其进行了“硬”编码。如果我的网站列表是 100,我将如何做同样的事情?如何维护站点的顺序?

如果我对数组进行排序 [arrayKey sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

索引 2 不会变成索引 0 吗?如果它变为索引 0,那么您可以看到 dictionaryOfSites 带有错误的 URL 标签。

【问题讨论】:

  • 最好的方法是创建一个代表您的站点的自定义类,并包括两个属性:名称和 URL 例如。然后创建该类的一个实例,设置两个属性,并将其放入一个数组中。然后,您可以根据对象的 name 属性对数组进行排序。
  • 发表您的评论作为解决方案,以便您获得荣誉。你能告诉我你所指的例子吗?我对此感到非常困惑
  • 嗨 CocoaN00b,我通常会,但我要出门了,几个小时内都不会重新上线。我只是想将此作为快速评论发布,以帮助您指出正确的方向。这个网站是(或应该)更多地帮助人们而不是“获得信用”。如果我回来后您仍然需要帮助,我会为您发布一个更完整的示例,但是使用我之前评论中的信息,您应该能够在 SO 和 Google 上搜索做到这一点的好示例.祝你好运!
  • 所以主要问题是这样的:知道你的字典不保持排序顺序,你能不能在一开始就把它改成别的东西,或者你是否坚持它,只需要一种复制的方法将数据放入排序数组中?

标签: ios nsmutablearray nsmutabledictionary


【解决方案1】:

因此,您可以使用自定义类(正如我在上面的评论中提到的),或者更好的是使用 NSDictionary 来存储 MarkM 建议的值。

编辑:“我不必维护字典。它是一个全新的应用程序。”

由于您不需要像您发布的那样从一本大字典开始,因此最好将每个站点的单个字典对象存储在一个数组中,而不必担心转换。

// Setup the initial array
NSMutableArray *arrayOfSites = [NSMutableArray new];
[arrayOfSites addObject:@{@"Name" : @"Example.com",
                          @"URL"  : @"http://www.example.com"}];
[arrayOfSites addObject:@{@"Name" : @"Site1",
                          @"URL"  : @"http://www.site1.com"}];
[arrayOfSites addObject:@{@"Name" : @"Apple",
                          @"URL"  : @"http://www.apple.com"}];

// At this point, arrayOfSites contains a dictionary object for each site.
// Each dictionary contains two keys:  Name and URL with the appropriate objects.
// Now we just need to sort the array by the Name key in the dictionaries:
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"Name"  ascending:YES];
[arrayOfSites sortUsingDescriptors:[NSArray arrayWithObjects:descriptor, nil]];

NSLog(@"%@", arrayOfSites);

结果:

2013-05-07 18:19:08.386 Testing App[75712:11f03] (
        {
        Name = Apple;
        URL = "http://www.apple.com";
    },
        {
        Name = "Example.com";
        URL = "http://www.example.com";
    },
        {
        Name = Site1;
        URL = "http://www.site1.com";
    } )

要访问数据,您可以使用:

NSString *name = [[arrayOfSites objectAtIndex:indexPath.row] objectForKey:@"Name"];

请注意,arrayOfSites 应该是您的类的声明属性,以便您可以从不同的方法访问它。

【讨论】:

  • 我不需要维护字典。这是一个全新的应用程序。
  • NSMutableDictionary 有什么区别?我认为 NSMutableDictionary 允许我添加/删除对象。而 NSDictionary 不能改变
  • 我听从了你的建议,新的 MutableArray 正在存储字典。如何访问名称、URL 以便将其放入我的 UITableView
  • 除非您需要更改站点名称或 URL,否则您不需要可变字典。如果这些改变,然后切换到一个可变的。午饭回来后,我将发布一个示例,说明如何访问这些值。
【解决方案2】:

您需要做的是将您的 NSDictionary 对象存储在数组中,然后根据需要访问该数组中的值以进行排序。您实际上并没有为排序存储新字符串。您只需在数组中的索引处检查字典中某个键的值。

Here 是对字典数组进行排序的好来源

【讨论】:

  • 我认为您的意思是为每个站点创建一个 NSDictionary 对象,并将每个对象存储在数组中(只是为了帮助提出问题的人澄清)。
  • 正确。您可以检查数组中 dict 的值以查找名称以进行排序。
猜你喜欢
  • 2010-11-06
  • 2011-07-31
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多