【问题标题】:Sorting array of objects by two criterias?按两个标准对对象数组进行排序?
【发布时间】:2010-01-15 13:19:19
【问题描述】:

我有一个要按两个键排序的对象数组。可以说的对象是 Student 类型,而我对我的排序感兴趣的属性是 gradename

Student
{
    double grade;
    string name;
    ...
} 

如何先按等级然后按名称对对象进行排序?例如,如果我有清单: 汤姆 9.9 安德鲁 9.8 佳士得 10 垫子 9.8 艾莉森 10 艾达 9.8

在我应该有的排序之后: 艾莉森 10 佳士得 10 汤姆 9.9 阿达 9.8 安德鲁 9.8 垫子 9.8

而不是 佳士得 10 艾莉森 10 汤姆 9.9 安德鲁 9.8 阿达 9.8 垫子 9.8

任何指针都非常有用。

【问题讨论】:

    标签: objective-c arrays sorting


    【解决方案1】:

    我对自己的 Objective-c 知识很不了解,但有一些很好的指针 here 并且总是有 documentation。这是我的破解之道...

    NSSortDescriptor *gradeSorter = [[NSSortDescriptor alloc] initWithKey:@"grade" ascending:YES];
    NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    
    [personList sortUsingDescriptors:[NSArray arrayWithObjects:gradeSorter, nameSorter, nil]];
    

    【讨论】:

    • 我认为这是最简单的方法。使用排序描述符进行排序允许您实现任何级别的分层排序。也就是说,所有对象都根据第一个排序描述符排序,任何剩余的重复项都根据第二个第三个描述符排序,依此类推。如果需要,请参阅 github.com/LucasTizma/spot_trot_helpers#nsarray+stadditions 上的 NSArray (NSArray+STAdditions) 上的我的类别,这有助于巩固使用排序描述符的语法。
    【解决方案2】:

    您基本上需要实现自己的比较器并使用NSArray 排序方法之一(例如sortedArrayUsingSelector:

    -(NSComparisonResult)compare:(Student *)student {
      // sort by name
      int nameComp = [name compare:student.name];
      if (nameComp != NSOrderedSame) return nameComp;
    
      // reverse ordered as desired in the question
      if (grade > student.grade)
        return NSOrderedAscending;
      else if (grade == student.grade) // watchout here
        return NSOrderedSame;
      else
        return NSOrderedDescending;
    }
    
    NSArray *unsrtedArray = ...
    NSArray *sortedArray = [unsortedArray sortedArrayUsingSelector:@selector(compare:)];
    

    【讨论】:

      【解决方案3】:

      _pScheduleArr :我下面代码中的数组名称。此数组包含自定义模型对象。我代表日期和字母顺序比较数组。日期也存在于数组内部的数组中(核心数据模型)。​​

      _pScheduleArr = [[_pScheduleArr sortedArrayUsingComparator:^NSComparisonResult(会议 *obj1, 会议 *obj2) {

          NSOrderedSet *personSetObj1 = obj1.timeSlots;
          Timeslot *tt1 = [[personSetObj1 array] objectAtIndex:0];
          NSOrderedSet *personSetObj2 = obj2.timeSlots;
          Timeslot *tt2 = [[personSetObj2 array] objectAtIndex:0];
          NSDate *date11 = tt1.startTime;
          NSDate *date12 = tt2.startTime;
      
            NSComparisonResult comresult = [date11 compare:date12];
            if (comresult == NSOrderedSame) {
                comresult = [obj1.title compare:obj2.title];
            }
            return comresult;
      
        }] mutableCopy];
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-12
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        相关资源
        最近更新 更多