nsdictionary 上的排序给出的结果与 nsarray 上的排序不同

Posted

技术标签:

【中文标题】nsdictionary 上的排序给出的结果与 nsarray 上的排序不同【英文标题】:sort on nsdictionary is giving different result than sort on nsarray 【发布时间】:2014-01-09 06:05:07 【问题描述】:

2 天前我问了如何按字符串对象中的第二个单词对元素进行排序的问题和

我得到了解决方案here

但现在我陷入了新问题

想想我有

nsarray with--> 名字和

nsdictionary 具有相同的 -->names(of nsarray) 作为值和电子邮件 ID 作为键

而我的 nsarray 包含

   "Test Teacher"

   "Anonymous"

   "Dok Teacher"

我的 nsdictionary 包含

   "Dok Teacher" --"a@g.com"

   "Anonymous" --  "b@g.com"

   "Test Teacher" --"c@g.com"

由于需要对这些数组和字典进行排序,因此我使用上面链接中给出的方法对它们进行了排序

但排序后我得到如下数据

排序后的nsarray第二个单词

   "Anonymous"

   "Test Teacher"

   "Dok Teacher"

排序后的字典第二个单词的值

   "Anonymous" --  "b@g.com"

   "Dok Teacher" --"a@g.com"

   "Test Teacher" --"c@g.com"

为什么使用相同的排序方法后,Dok Teacher 和 Test Teacher 在字典和 nsarray 中的不同位置。

以及如何以相同的顺序获取数组和字典。

nsarray 排序代码:

NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:[teachersNames sortedArrayUsingComparator:^NSComparisonResult(id a, id b) 
        NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        return [firstTeacher2ndWord compare:secondTeacher2ndWord];
    ]];

    NSLog(@"After %@",sortedArray);

    teachersSrc=[NSMutableArray arrayWithArray:sortedArray];

nsdictionary 排序代码

    myArray = [teachersList keysSortedByValueUsingComparator:^NSComparisonResult(id a, id b) 
        NSString *firstTeacher2ndWord = [[[((NSString*)a) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        NSString *secondTeacher2ndWord = [[[((NSString*)b) componentsSeparatedByString:@" "] objectAtIndex:1] lowercaseString];
        return [firstTeacher2ndWord compare:secondTeacher2ndWord];
    ];

    NSLog(@"After %@",myArray);

编辑:

我也尝试过对数组和字典的名字进行排序,然后对两者的姓氏进行排序,但它根本不起作用,

【问题讨论】:

用适当的缩进编辑你的问题。 为什么要维护两个不同的集合,数组和字典? 因为我希望名称在排序数组中,所以当我对 nsarray 进行排序时,排序顺序会保留在 nsarray 中,但不会保留在 nsdictionary 中。 @Janak NSMutableDictionary 根本没有任何sorting problems!这是一个无序的集合,因此您无法对其进行排序。句号。 ;) 如果您需要有序的东西,请使用有序集合(例如 NS[Mutable]Array)。 字典无法排序。 【参考方案1】:

鉴于你有这个:

 NSArray *array = @[@"Test Teacher",@"Anonymous",@"Dok Teacher"];
 NSDictionary *dictionary = @@"a@g.com":@"Dok Teacher",@"b@g.com":@"Anonymous",@"c@g.com":@"Test Teacher";


//sort the array first
    NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
    NSString *firstTeacher2ndWord  =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject];
     NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject];


    if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE) // means they are the same
        //compare full text
        firstTeacher2ndWord = (NSString *)obj1;
        secondTeacher2ndWord = (NSString *)obj2;
    

    return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch];
];

 NSLog(@"Sorted Array %@",sortedArray);

//sort the dictionary key using values
    NSArray *sortedDictionaryKey =[dictionary keysSortedByValueUsingComparator:^NSComparisonResult(id obj1, id obj2) 
      NSString *firstTeacher2ndWord  =[[(NSString *)obj1 componentsSeparatedByString:@" "]lastObject];
     NSString *secondTeacher2ndWord =[[(NSString *)obj2 componentsSeparatedByString:@" "]lastObject];


    if([firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch] == FALSE) // means they are the same
        //compare full text
        firstTeacher2ndWord = (NSString *)obj1;
        secondTeacher2ndWord = (NSString *)obj2;
    


    return [firstTeacher2ndWord compare:secondTeacher2ndWord options:NSCaseInsensitiveSearch]
];

//get the values from the dictionary based on the sorted keys
 NSLog(@"Sorted Dictionary %@",[dictionary objectsForKeys:sortedDictionaryKey notFoundMarker:[NSNull null]]);

会给你这个输出:

//Sorted Array
Sorted Array(
Anonymous,
"Dok Teacher",
"Test Teacher"
)

//Sorted Dictionary
Sorted Dictionary(
    Anonymous,
    "Dok Teacher",
    "Test Teacher"
  )

【讨论】:

您是否使用过第二个单词(即 DOK、Test 中的“Teacher”)进行排序,如果是,您从哪里得到它?就像我的情况一样 objectAtIndex:2 @VirendraRavalji 你的意思是你只按第二个词对条目进行排序?如果它们相同,那是您唯一一次比较整个单词?对吗? 你部分正确,因为我还没有编写代码来考虑全名或完整字符串 因为我提供的代码比较了整个字符串,不区分大小写 hmm,但只有全名,当姓或第二个单词相同时【参考方案2】:

首先Dictionary(teachersList)的value数组是未排序的,不知道里面的元素是怎么排列的。

第二个Dok TeacherTest Teacher在第二个单词上是一样的,它们之间没有顺序,排序后的顺序取决于排序方式(稳定或不稳定)和原始数组的顺序.

如果值数组中的元素在teachersNames 中的顺序相同,则结果将相同。否则Dok TeacherTest Teacher 的顺序是不确定的。

注意:这里的值数组是teachersList.allValues

【讨论】:

是正确的,但是如何使它们以相同的顺序排列,我也尝试对数组和字典的名字进行排序,然后对两者的姓氏进行排序,但它根本不起作用,如何解决这个问题? @VirendraRavalji 如果您希望它们具有相同的顺序,您必须确保用于排序的键是唯一的。所以我认为你应该对名字进行排序,既不是姓氏也不是名字。 我愿意,但客户要求 @VirendraRavalji 那么您对客户的要求是什么? @VirendraRavalji 没关系,但你为什么要对 `teachersList.如果你想让数组和字典的排序结果相同,就使用排序后的教师姓名的结果,为什么你需要在字典上排序。【参考方案3】:

您的代码中的问题是第二个名称Teacher 包含两个单词。因此,当您在数组中进行相同的排序时。它将按字母顺序对名称进行排序。由于两个单词的第二个名称相同。所以它不会反映在输出中。但是,如果您更改顺序,那么您可以看到预期的输出。我已经实现了以下对数组进行排序的代码:-

当执行下面的代码时,你会得到输出:-

  NSArray *array1=@[@"Test Teacher",@"Anonymous",@"Dok Teacher"];
NSArray *sortedArray=[array1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 
    return [obj1 compare:obj2 options:NSCaseInsensitiveSearch];
];
NSLog(@"%@",sortedArray);

输出:-

 Anonymous,
 "Dok Teacher",
 "Test Teacher"

【讨论】:

按我的排序优先级只有姓氏,在这种情况下即老师,我想你已经考虑了全名 @virendra,我只对输出中您想要的数组名称进行了排序。 你读过我的完整问题吗,如果我按名字排序(第一个单词,即 Dok,在这种情况下为测试),我会得到这样的输出,但是当我按第二个名字排序时(即老师在这种情况下)我没有得到这个命令。看我的代码三是“objectAtIndex:2” 对不起 Virendra,我还是不清楚。但是为什么要按第二个名字对它们进行排序呢?? 现在你明白我的意思了,我希望他们按第二个名字排序,因为客户希望教师列表按姓氏排序,你在代码中所做的是正确的,但它首先排序名称,因此您将获得相同的订单

以上是关于nsdictionary 上的排序给出的结果与 nsarray 上的排序不同的主要内容,如果未能解决你的问题,请参考以下文章

常见排序算法

Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?

Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?

快速排序算法(Cormen)给出了 ***

NSDictionary 可以与 iPhone 上的 TableView 一起使用吗?

SDUT-3398_数据结构实验之排序一:一趟快排