【问题标题】:Sort NSMutableArray排序 NSMutableArray
【发布时间】:2010-08-24 13:18:20
【问题描述】:

请帮帮我 我想对 NSMutableArray 进行排序,是的,我可以这样做

NSSortDescriptor *sortPoint = [[NSSortDescriptor alloc] initWithKey:@"point" ascending:YES];
[hightScore sortUsingDescriptors:[NSArray arrayWithObject:sortPoint]];

但是在 NSMuatableArray(hightScore) 中,我有 2 个这样的 NSMutableDictionary

[item setObject:@"player_name" forKey:@"name"];
[item setObject:@"100" forKey:@"point"];

当我按关键字“point”排序时,它给了我这样的字符串 100 > 20 > 30 > 50 相反应该是 20 > 30 > 50 > 100

有任何想法都可以。

【问题讨论】:

    标签: cocoa string sorting nsmutablearray nsmutabledictionary


    【解决方案1】:

    有三种解决方案:

    1. 将 NSNumber 实例放入字典中以代替您当前拥有的字符串(例如,@"100")。 NSNumber 对象应该用数字比较自己。

    2. 向数组发送sortUsingComparator:sortUsingFunction:context: 消息而不是sortUsingDescriptors:,传递一个块或函数来检索字符串并进行数字比较(通过发送compare:options: 消息和NSNumericSearch 选项)。

      请注意,块或函数将传递整个字典,而不是字符串,因为它无法知道要提取哪些字符串,因此您必须自己从字典中取出字符串才能进行比较他们。

    3. model objects 替换字典,其中properties 代替字典键。如果你用数字类型声明属性(例如,NSUInteger),那么当数组使用 KVC 访问属性时,它将获得 NSNumber 对象,正如上面 #1 中所述,它们应该以数字方式比较它们自己。

    我会选择#3。

    【讨论】:

    • 如何声明数字类型的属性?
    • 声明时给它一个数字类型。我链接到的文档向您展示了如何声明属性。
    • 非常感谢我使用了选择并且它有效!这是我给大家的代码 [item setObject:[NSNumber numberWithInt:[[[_modeObject valueForKey:@"point"] description] intValue]] forKey:@"point"]; **项目是 NSMutableArray
    • mr.october:这不是#3,而是#1,并且以非常迂回的方式实现。当其他代码期望在那里找到字符串并获取数字时,此代码是否会在以后引起问题?为什么不首先创建数字并将它们放入字典中呢?为什么不实际做#3(用模型对象替换你的字典)?
    • 我必须从核心数据中读取数据并将它们放入 NSMutableArray。我是 Xcode 的新手,非常感谢您的帮助,因为我在 3 天后才找到这个解决方案。非常感谢^__^
    【解决方案2】:

    最好的方法是将你的号码存储为 NSNumbers:

    [index addObject:[[NSNumber alloc] initWithInt:number]];
    

    然后您可以使用[NSNumber compare:] 方法对数组进行排序:

    [index sortUsingSelector:@selector(compare:)];
    

    【讨论】:

      【解决方案3】:
      NSMutableArray* tempArray = [NSMutableArray arrayWithArray:anArray];
      [tempArray sortUsingSelector:@selector(caseInsensitiveCompare:)];
      

      我在一些代码中使用它?这行得通吗?

      另外,刚刚注意到您将数组对象设置为字符串,我认为这也是一个问题。尝试将它们添加为 NSIntegers 或 ints...这是否有效?

      【讨论】:

      • 问题是提问者是默认比较字符串的,不是数值比较。 caseInsensitiveCompare: 也不是数字比较。
      • 这是我的代码:[item setObject:[NSNumber numberWithInt:[[[_modeObject valueForKey:@"point"] description] intValue]] forKey:@"point"];也许可以帮助你^____^
      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多