NSDictionary 使用 keysSortedByValu

2023-02-24  本文已影响0人  yulekwok

原因

昨天app上的广告系统在做比价策略,小伙伴遇到了关于在NSDictionary keysSortedByValueUsingComparator 比较的时候遇到问题,总是随机出结果,不是自己想要的结果,所以记录一下。

总结如下

keysSortedByValueUsingComparator 比较的id _Nonnull obj1, id _Nonnull obj2 是两个临时变量,如果打印其地址会发现,可能每次输出的都相同,也可能不同。如果直接使用 if (obj1 > obj2) 则比较的是两个的变量的内存地址,因为iOS NSDictionary value 不能是int,所以需要转成NSNumber,那么比较的时候就不能简单比较了,需要拿到其value 进行比较 .

如下是正确的方法和测试案例

  1. 正确的方法

retArray = [dict keysSortedByValueUsingComparator:^NSComparisonResult(NSNumber * _Nonnull obj1, NSNumber *  _Nonnull obj2) {
        // NSLog(@"obj1 = %@ obj2 = %@",obj1,obj2);
        // NSLog(@"obj1address = %x obj2 = %x",&obj1,&obj2);
        if( obj1.intValue >= obj2.intValue){
            //NSLog(@"compare obj1 = %d obj2 = %x",obj1.intValue,obj2.intValue);
            // NSLog(@"compare obj1address = %x obj2 = %x",&obj1,&obj2);
            return NSOrderedAscending;
        }
        return NSOrderedDescending;
        
    }];
  1. 测试案例

    NSMutableDictionary * dict = [NSMutableDictionary new];
    for (int i =0; i<5; i++) {
        dict[[NSString stringWithFormat:@"AD%d",arc4random()%100]]=@(arc4random()%1024);
    }
    NSLog(@"dict = %@",dict);
    // 进行比价
    // 第一种方案,结果发现不靠谱
    
    /**
     dict = {
     AD27 = 67;
     AD33 = 453;
     AD39 = 389;
     AD47 = 615;
     AD87 = 696;
     }
     ret
     key AD39-- value 389
     key AD27-- value 67
     key AD47-- value 615
     key AD33-- value 453
     key AD87-- value 696
     */
    NSArray * retArray = [dict keysSortedByValueUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        return NSOrderedAscending;
    }];
    // 第二种方案,依旧错误
    /**
     dict = {
         AD11 = 879;
         AD79 = 63;
         AD80 = 249;
         AD84 = 86;
         AD88 = 228;
     }
     key AD11-- value 879
     key AD88-- value 228
     key AD84-- value 86
     key AD79-- value 63
     key AD80-- value 249
     */
    retArray = [dict keysSortedByValueUsingComparator:^NSComparisonResult(NSNumber * _Nonnull obj1, NSNumber *  _Nonnull obj2) {
        // NSLog(@"obj1address = %x obj2 = %x",&obj1,&obj2);
        if( obj1 >= obj2){
            // NSLog(@"compare obj1address = %x obj2 = %x",&obj1,&obj2);
            return NSOrderedAscending;
        }
        return NSOrderedDescending;
        
    }];
    // 经过各种资料的调研发现,比较的  if( obj1 >= obj2) 仅仅是地址大小,所以如果想实现真正的价格比较应该是比NSNumber 的value值
    /**
     dict = {
         AD17 = 809;
         AD51 = 719;
         AD52 = 640;
         AD63 = 949;
         AD7 = 852;
     }
     key AD63-- value 949
     key AD7-- value 852
     key AD17-- value 809
     key AD51-- value 719
     key AD52-- value 640
     */
    retArray = [dict keysSortedByValueUsingComparator:^NSComparisonResult(NSNumber * _Nonnull obj1, NSNumber *  _Nonnull obj2) {
        // NSLog(@"obj1 = %@ obj2 = %@",obj1,obj2);
        // NSLog(@"obj1address = %x obj2 = %x",&obj1,&obj2);
        if( obj1.intValue >= obj2.intValue){
            //NSLog(@"compare obj1 = %d obj2 = %x",obj1.intValue,obj2.intValue);
            // NSLog(@"compare obj1address = %x obj2 = %x",&obj1,&obj2);
            return NSOrderedAscending;
        }
        return NSOrderedDescending;
        
    }];
    
    for (NSString * key in retArray) {
        NSLog(@"key %@-- value %@",key,dict[key]);
    }
上一篇下一篇

猜你喜欢

热点阅读