【问题标题】:objective-c nsmutablearray setValue forKey issueobjective-c nsmutablearray setValue forKey 问题
【发布时间】:2011-08-29 20:06:19
【问题描述】:

我的代码:

NSArray *array = //objects here
NSMutableArray *mutarray = [[NSMutableArray alloc] init];

    for (NSString *s in array)
    {
        NSRange ran = [s rangeOfString:@"abc"];
    if (ran.location != NSNotFound)
    {
        int inde = [array indexOfObject:s];
        [mutarray setValue:[NSNumber numberWithInt:inde] forKey:s];
    } 
    }
    NSLog (@"mutarray: %@", mutarray);  

我试过 NSMutableDictionary,但是内容是无序的,所以我更喜欢 NSMutableArray 有序地存储 Values 和 Keys。但是 NSLog 的输出什么也没显示,到底是什么? NSMutableDictionary 的输出显示了四个发现。


编辑:

我什至在 NSLog 前面尝试过这段代码,但没有显示:

[mutarray setValue:@"aha" forKey:@"jaha"];

编辑: 伙计们,谢谢你的回答!现在我明白了。但问题是我将数字存储为值,将字符串存储为键。我有一个无序的 NSMutableDictionary。我还没有弄清楚我应该如何订购它。我有我使用的代码,但没有正确编写:

NSInteger intSort(id num1, id num2, void *context)
{
    int v1 = [num1 intValue];
    int v2 = [num2 intValue];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}   

其他方式:

NSArray *ordered = [[mutdic allValues] sortedArrayUsingFunction:intSort context:NULL];
NSLog (@" ordered: %@", ordered);

输出只显示:

2011-08-29 22:36:03.998 scanner2[32359:207]  ordered: (
    1,
    5,
    9,
    16
)

输出应按数字顺序显示:

2011-08-29 22:36:03.992 scanner2[32359:207] mutdic:  5 jam (geologi) en
2011-08-29 22:36:03.993 scanner2[32359:207] mutdic:  9 jax. (geologi)jammen
2011-08-29 22:36:03.994 scanner2[32359:207] mutdic:  1 beta (geologi).
2011-08-29 22:36:03.995 scanner2[32359:207] mutdic: 16 .(geologi),be;ta;

【问题讨论】:

    标签: objective-c nsmutablearray setvalue


    【解决方案1】:

    NSMutableArray 不存储键/值对,它只存储对象。要将对象添加到数组中,请使用-addObject: 方法。

    使用数组来存储对象的有序列表。当您需要查找给定某个键的对象时,请使用字典。如果您想要字典键的有序列表,请使用

    NSArray* orderedKeys = 
        [[myDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
    

    编辑:更多选项。

    1. 只需存储一个索引数组,然后在您的主字符串array 中查找值。

      for (NSUInteger i = 0; i < [array count]; ++i)
      {
          NSString* s = [array objectAtIndex:i];
          NSRange ran = [s rangeOfString:@"abc"];
          if (ran.location != NSNotFound)
          {
              [mutarray addObject:[NSNumber numberWithInt:i]];
          } 
      }
      
      for (NSNumber* index in mutarray)
      {
          NSLog(@"Found %@:%@", index, [array objectAtIndex:[index intValue]]);
      }         
      
    2. 存储索引和字符串的二维数组:

      for (NSUInteger i = 0; i < [array count]; ++i)
      
      {
          NSString* s = [array objectAtIndex:i];
          NSRange ran = [s rangeOfString:@"abc"];
          if (ran.location != NSNotFound)
          {
              [mutarray addObject:
                  [NSArray arrayWithObjects:[NSNumber numberWithInt:i],
                                            s,
                                            nil]]; 
          } 
      }
      

    【讨论】:

    • 这是我需要的第二个选项!我爱你:D
    【解决方案2】:

    NSArray 是一个有序的对象集合。它不是对象的键值映射。在 NSArray 上调用 setValue:forKey: 与向其每个项目发送 setValue:forKey: 相同。

    【讨论】:

      【解决方案3】:

      这个setValue:ForKey:方法不是来自NSMutableArray,是NSKeyValueCodingProtocol

      在您的情况下,由于您想要从字典中排序结果,您可以查看以下方法:

      --keysSortedByValueUsingSelector: – keysSortedByValueUsingComparator: – keysSortedByValueWithOptions:usingComparator:

      如果您需要对值进行排序,只需使用返回数组的 allKeys。您可以使用以下任何一种方法对数组进行排序:

      --sortedArrayHint – sortedArrayUsingFunction:上下文: – sortedArrayUsingFunction:context:hint: – sortedArrayUsingDescriptors: – sortedArrayUsingSelector: – sortedArrayUsingComparator: – sortedArrayWithOptions:usingComparator:

      【讨论】:

        【解决方案4】:

        您似乎想要存储一个有序的配对列表。所以 NSArray 的 NSArrays

        for (NSString *s in array)
        {
            NSRange ran = [s rangeOfString:@"abc"];
            if (ran.location != NSNotFound)
            {
                int inde = [array indexOfObject:s];
                NSArray* pair = [NSArray arrayWithObjects:[NSNumber numberWithInt:inde],s,nil];
                [mutarray addObject: pair];
            } 
        }
        

        【讨论】:

        • 谢谢。这就是 Darren 的第二个选项的样子,除了你创建了一个包含两个 NSArray 的 NSMutableArray。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-02
        • 1970-01-01
        相关资源
        最近更新 更多