如何对包含自定义对象的NSMutableArray进行排序?

1324

我想做的事情似乎很简单,但是在网上找不到任何答案。我有一个包含对象的NSMutableArray,假设它们是“Person”对象。我想按Person.birthDate(一个NSDate)对NSMutableArray进行排序。

我认为与此方法有关:

NSArray *sortedArray = [drinkDetails sortedArrayUsingSelector:@selector(???)];

在Java中,我会让我的对象实现Comparable接口,或者使用带有内联自定义比较器的Collections.sort()方法...但在Objective-C中该怎么做呢?

27个回答

3

您需要创建sortDescriptor,然后可以使用类似下面的sortDescriptor对nsmutablearray进行排序。

 let sortDescriptor = NSSortDescriptor(key: "birthDate", ascending: true, selector: #selector(NSString.compare(_:)))
 let array = NSMutableArray(array: self.aryExist.sortedArray(using: [sortDescriptor]))
 print(array)

3
在我的情况下,我使用"sortedArrayUsingComparator"来对数组进行排序。请看下面的代码。
contactArray = [[NSArray arrayWithArray:[contactSet allObjects]] sortedArrayUsingComparator:^NSComparisonResult(ContactListData *obj1, ContactListData *obj2) {
    NSString *obj1Str = [NSString stringWithFormat:@"%@ %@",obj1.contactName,obj1.contactSurname];
    NSString *obj2Str = [NSString stringWithFormat:@"%@ %@",obj2.contactName,obj2.contactSurname];
    return [obj1Str compare:obj2Str];
}];

同时我的目标是:
@interface ContactListData : JsonData
@property(nonatomic,strong) NSString * contactName;
@property(nonatomic,strong) NSString * contactSurname;
@property(nonatomic,strong) NSString * contactPhoneNumber;
@property(nonatomic) BOOL isSelected;
@end

2
  let sortedUsers = users.sorted {
    $0.firstName < $1.firstName
 }

问题是关于NSMutableArray,而不是Swift中的Arrays集合。 - Ricardo

2

在Swift中对数组进行排序


对于Swifty人来说,以下是一种非常简洁的方法,可用于全局实现上述目标。让我们以一个自定义类User为例,该类具有一些属性。

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
}

现在我们有一个数组,需要根据createdDate进行升序和/或降序排序。因此,让我们添加一个日期比较函数。

class User: NSObject {
    var id: String?
    var name: String?
    var email: String?
    var createdDate: Date?
    func checkForOrder(_ otherUser: User, _ order: ComparisonResult) -> Bool {
        if let myCreatedDate = self.createdDate, let othersCreatedDate = otherUser.createdDate {
            //This line will compare both date with the order that has been passed.
            return myCreatedDate.compare(othersCreatedDate) == order
        }
        return false
    }
}

现在让我们为“用户”创建一个“数组”的扩展。简单来说,让我们仅为那些只包含“用户”对象的数组添加一些方法。请保留HTML标记,但不要写解释。
extension Array where Element: User {
    //This method only takes an order type. i.e ComparisonResult.orderedAscending
    func sortUserByDate(_ order: ComparisonResult) -> [User] {
        let sortedArray = self.sorted { (user1, user2) -> Bool in
            return user1.checkForOrder(user2, order)
        }
        return sortedArray
    }
}

升序用法

let sortedArray = someArray.sortUserByDate(.orderedAscending)

按降序使用方法

let sortedArray = someArray.sortUserByDate(.orderedAscending)

同序使用方法


let sortedArray = someArray.sortUserByDate(.orderedSame)

如果Array[User] || Array<User>类型,则上述extension方法才能访问。


2

对于嵌套对象,可以像这样使用:

NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastRoute.to.lastname" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSMutableArray *sortedPackages = [[NSMutableArray alloc]initWithArray:[packages sortedArrayUsingDescriptors:@[sortDescriptor]]];

lastRoute 是一个对象,该对象包含 to 对象,to 对象包含 lastname 字符串值。


2

Swift版本:5.1

如果您有一个自定义的结构体或类,并希望对它们进行任意排序,您应该使用尾随闭包调用sort(),该闭包按照您指定的字段进行排序。以下是一个使用自定义结构体数组的示例,该数组按特定属性进行排序:

    struct User {
        var firstName: String
    }

    var users = [
        User(firstName: "Jemima"),
        User(firstName: "Peter"),
        User(firstName: "David"),
        User(firstName: "Kelly"),
        User(firstName: "Isabella")
    ]

    users.sort {
        $0.firstName < $1.firstName
    }

如果你想返回一个已排序的数组而不是就地排序,可以使用sorted()函数,像这样:

    let sortedUsers = users.sorted {
        $0.firstName < $1.firstName
    }

-2
NSMutableArray *stockHoldingCompanies = [NSMutableArray arrayWithObjects:fortune1stock,fortune2stock,fortune3stock,fortune4stock,fortune5stock,fortune6stock , nil];

NSSortDescriptor *sortOrder = [NSSortDescriptor sortDescriptorWithKey:@"companyName" ascending:NO];

[stockHoldingCompanies sortUsingDescriptors:[NSArray arrayWithObject:sortOrder]];

NSEnumerator *enumerator = [stockHoldingCompanies objectEnumerator];

ForeignStockHolding *stockHoldingCompany;

NSLog(@"Fortune 6 companies sorted by Company Name");

    while (stockHoldingCompany = [enumerator nextObject]) {
        NSLog(@"===============================");
        NSLog(@"CompanyName:%@",stockHoldingCompany.companyName);
        NSLog(@"Purchase Share Price:%.2f",stockHoldingCompany.purchaseSharePrice);
        NSLog(@"Current Share Price: %.2f",stockHoldingCompany.currentSharePrice);
        NSLog(@"Number of Shares: %i",stockHoldingCompany.numberOfShares);
        NSLog(@"Cost in Dollars: %.2f",[stockHoldingCompany costInDollars]);
        NSLog(@"Value in Dollars : %.2f",[stockHoldingCompany valueInDollars]);
    }
    NSLog(@"===============================");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接