objective c - अपने संबंधित मूल्यों द्वारा क्रमबद्ध NSDictionary कुंजी प्राप्त करना




objective-c cocoa-touch (4)

मेरे पास पूर्णांक मानों वाला एक NSMutableDictionary , और मैं अपने संबंधित मानों से आरोही क्रमबद्ध चाबियों की एक सरणी प्राप्त करना चाहता हूं। उदाहरण के लिए, इस शब्दकोश के साथ:

mutableDict = {
    "A" = 2,
    "B" = 4,
    "C" = 3,
    "D" = 1,
}

मैं सरणी ["D", "A", "C", "B"] साथ समाप्त करना चाहता हूं। मेरा वास्तविक शब्दकोश निश्चित रूप से केवल चार वस्तुओं की तुलना में काफी बड़ा है।


यहां एक समाधान है:

NSDictionary *dictionary; // initialize dictionary
NSArray *sorted = [[dictionary allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    return [[dictionary objectForKey:obj1] compare:[dictionary objectForKey:obj2]];
}];

यहां मैंने कुछ ऐसा किया है:

NSMutableArray * weekDays = [[NSMutableArray alloc] initWithObjects:@"Sunday",@"Monday",@"Tuesday",@"Wednesday",@"Thursday",@"Friday",@"Saturday", nil];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSMutableArray *dictArray = [[NSMutableArray alloc] init];

for(int i = 0; i < [weekDays count]; i++)
{
    dict = [NSMutableDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:i],@"WeekDay",[weekDays objectAtIndex:i],@"Name",nil];
    [dictArray addObject:dict];
}
NSLog(@"Before Sorting : %@",dictArray);

@try
{
    //for using NSSortDescriptor
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"WeekDay" ascending:YES];
    NSArray *descriptor = @[sortDescriptor];
    NSArray *sortedArray = [dictArray sortedArrayUsingDescriptors:descriptor];
    NSLog(@"After Sorting : %@",sortedArray);

    //for using predicate
    //here i want to sort the value against weekday but only for WeekDay<=5
   int count=5;
    NSPredicate *Predicate = [NSPredicate predicateWithFormat:@"WeekDay <=%d",count];
    NSArray *results = [dictArray filteredArrayUsingPredicate:Predicate];

    NSLog(@"After Sorting using predicate : %@",results);
}
@catch (NSException *exception)
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Sorting cant be done because of some error" message:[NSString stringWithFormat:@"%@",exception] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert setTag:500];
    [alert show];
    [alert release];
}

NSDictionary विधि keysSortedByValueUsingComparator: चाल करना चाहिए।

आपको बस एक NSComparisonResult की एक विधि की आवश्यकता है जो ऑब्जेक्ट के मानों की तुलना करता है।

आपका शब्दकोश है

NSMutableDictionary * myDict;

और आपका ऐरे है

NSArray *myArray;

myArray = [myDict keysSortedByValueUsingComparator: ^(id obj1, id obj2) {

     if ([obj1 integerValue] > [obj2 integerValue]) {

          return (NSComparisonResult)NSOrderedDescending;
     }
     if ([obj1 integerValue] < [obj2 integerValue]) {

          return (NSComparisonResult)NSOrderedAscending;
     }

     return (NSComparisonResult)NSOrderedSame;
}];

संख्यात्मक स्थिरांक के बजाय बस NSNumber ऑब्जेक्ट्स का उपयोग करें।

बीटीडब्ल्यू, यह से लिया गया है: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Collections/Articles/Dictionaries.html


allKeys में यह साफ विधि है जिसे allKeys कहा जाता है।

यदि आप चाहते हैं कि सरणी को सॉर्ट किया जाए, तो keysSortedByValueUsingComparator: चाल करना चाहिए।

रिचर्ड का समाधान भी काम करता है लेकिन कुछ अतिरिक्त कॉल करता है जिनकी आपको आवश्यकता नहीं होती है:

// Assuming myDictionary was previously populated with NSNumber values.
NSArray *orderedKeys = [myDictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2){
    return [obj1 compare:obj2];
}];






nsdictionary