【问题标题】:Sort by the mode in an Array in Objective-C iPhone在Objective-C iPhone中按数组中的模式排序
【发布时间】:2011-01-31 01:51:49
【问题描述】:

如果我有一个包含一些值的 NSArray。有没有办法使用描述符将它按数组中最频繁的数字排在最前面,最不频繁的数字排在最后,

Array has(
"3",
"2",
"1",
"3",
"3",
"7",
)

Array has(
"3",
"3",
"3",
"1",
"2",
"7",
)

【问题讨论】:

    标签: iphone arrays nsarray mode


    【解决方案1】:

    并非没有一些额外的数据结构。

    所有 NSArray 排序操作(sortUsingDescriptors:、sortedArrayUsingSelector: 等)都假设您可以查看两个元素“a”和“b”并确定是否“a

    一种解决方案是创建一个新数组,其成员对象包含值和频率计数(使用 NSDictionary 有效地计算每个值的行数)。例如:

    Array( // {value, frequency}
    {3,3},
    {2,1},
    {1,1},
    {3,3},
    {3,3},
    {7,1}
    )
    

    然后很容易使用描述符按频率对该数组进行排序。

    【讨论】:

      【解决方案2】:
      @interface NSArray (Ext)
      -(NSArray*) sortByMostFrequent ;
      @end
      
      
      
      @implementation NSArray (Ext)
      -(NSArray*) sortByMostFrequent {
          NSMutableDictionary* frequencyDict = [NSMutableDictionary dictionary];
          for (id obj in self) {
              int frequency = [[frequencyDict valueForKey:obj] intValue];
              [frequencyDict setValue:[NSNumber numberWithInt:frequency+1] forKey:obj];
          }
          NSMutableArray* ary = [NSMutableArray arrayWithCapacity:self.count];
          for (id obj in self) {
              [ary addObject:[NSDictionary dictionaryWithObjectsAndKeys:
                              obj, @"Object",
                              [frequencyDict valueForKey:obj], @"Frequency",
                              nil]];
          }
          NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Frequency" ascending:NO];
          [ary sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
          [sortDescriptor release];
          return [ary valueForKey:@"Object"];
      }
      @end
      
      
      
      /// example
      NSArray* ary = [NSArray arrayWithObjects:@"3", @"2", @"1", @"3", @"3", @"7", nil];
      NSLog(@"ary %@", [ary sortByMostFrequent]);
      

      【讨论】:

        猜你喜欢
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 2012-04-17
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多