代码之家  ›  专栏  ›  技术社区  ›  snksnk

从特定值开始排序字典数组

  •  0
  • snksnk  · 技术社区  · 10 年前

    我有一组包含关键字的对象(字典) @"Category" 。我必须按一个特定的键排序,以该键开头。例如,如果 objects[@"Category"]: A, B ,C ,D ,E ,F ,G , H etc. 当用户选择“按C排序”时,我需要按对象重新排序根数组 [@"Category"] 至:C、D、E、F、G、H、A、B-或-C、A、B、D、C、F、C、H。

    我希望清楚我的目标是什么

    //    sortedPosts2 = [self.objects sortedArrayUsingComparator:^(PFObject *object1, PFObject *object2)  {
    //            return [object1[@"Category"] compare:object2[@"Category"] options:NSOrderedAscending];
    //    }];
    
    
    //    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:category ascending:YES];
    //    sortedPosts2 = [self.objects sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];
    
    
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationTop];
    }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Putz1103    10 年前

    我能想到的最简单的方法是排序块。然后可以手动调整数组比较值。这应该适用于 Category 。您可能需要更改大于符号或升序/降序返回,我总是会混淆升序/降序。。。

    NSArray *array;
    NSString *userSelectedValue = @"C";
    array = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSString *category1 = [[(NSDictionary*)obj1 objectForKey:@"Category"] lowercaseString];
        NSString *category2 = [[(NSDictionary*)obj2 objectForKey:@"Category"] lowercaseString];
    
        //Now check if either category's value is less than the user selected value
        NSComparisonResult result1 = [category1 compare:[userSelectedValue lowercaseString]];
        NSComparisonResult result2 = [category2 compare:[userSelectedValue lowercaseString]];
    
        if(result1 == result2)
        {
            return [category1 compare:category2];
        }
        else if(result1 > result2)
        {
            return NSOrderedDescending;
        }
        else
            return NSOrderedAscending;
    }];