[英]How does case insensitive sort work in Swift or other languages?
因此,我正在從 CoreData 獲取一些數據,並使用NSSortDescriptor
對其進行升序排序(我也嘗試過其他方法)。 發生的情況是具有相同文本的小寫字符串首先出現。 根據我的理解,在 ASCII 中,大寫字符串排在第一位('A' 從 65 開始),然后是小寫字符串('a' 從 97 開始),如果我們考慮這一點,按升序排序時,大寫字符串應該排在第一位。
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true, selector: #selector(NSString.caseInsensitiveCompare(_:)))
let entities = CoreDataManager.getData(entityName: "Entity", predicate: nil, sortDescriptor: sortDescriptor) as? [Entity]
在我的 CoreDataManager class 中,我有以下方法。
class CoreDataManager: NSObject {
static func getManagedObject() -> NSManagedObjectContext {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
return appDelegate.managedObjectContext
}
static func getData(entityName: String, predicate: NSPredicate? = nil, sortDescriptor: NSSortDescriptor? = nil) -> [NSManagedObject] {
var resultsManagedObject: [NSManagedObject] = []
do {
let managedObject = getManagedObject()
let request = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
if let descriptor = sortDescriptor {
request.sortDescriptors = [descriptor]
}
if predicate != nil {
request.predicate = predicate
}
let results = try managedObject.fetch(request)
resultsManagedObject = results as! [NSManagedObject]
} catch {
print("There was an error retrieving data")
}
return resultsManagedObject
}
}
我也嘗試過使用 arrays 的sorted
方法進行排序,但這也給出了與使用 NSSortDescriptor 相同的NSSortDescriptor
。
let arr = ["bamboo", "document", "BAMBOO", "DOCUMENT"]
print(arr.sorted { $0.lowercased() < $1.lowercased() }) // Output ~> ["bamboo", "BAMBOO", "document", "DOCUMENT"]
為什么排序會這樣工作? 其他語言也一樣嗎?
它不是首先對小寫進行排序。 它將大寫和小寫比較為equal 。 但顯然,在一個數組中,必須先有一些東西。 如果排序算法是“穩定的”,那么如果兩個元素比較相等,那么在輸入中首先出現的那個也將首先出現在 output 中。 如果算法“不穩定”,它們可能會以任何隨機順序出現。 看起來你得到了一個穩定的排序(或者只是幸運); 由於您的示例輸入在相應的大寫值之前具有小寫值,因此 output 也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.