Сортировка Swift-массива словарей по значению ключа
Я пытаюсь отсортировать массив Swift, состоящий из словарей. Я подготовил рабочий пример ниже. Цель состоит в том, чтобы отсортировать весь массив с помощью элемента "d" в словарях. Я подготовил этот рабочий пример, который можно поместить в проект Swift:
var myArray = Array<AnyObject>()
var dict = Dictionary<String, AnyObject>()
dict["a"] = "hickory"
dict["b"] = "dickory"
dict["c"] = "dock"
dict["d"] = 5
myArray.append(dict)
dict["a"] = "three"
dict["b"] = "blind"
dict["c"] = "mice"
dict["d"] = 6
myArray.append(dict)
dict["a"] = "larry"
dict["b"] = "moe"
dict["c"] = "curly"
dict["d"] = 2
myArray.append(dict)
println(myArray[0])
println(myArray[1])
println(myArray[2])
}
Это приводит к следующему выводу в журнал:
{
a = hickory;
b = dickory;
c = dock;
d = 5;
}
{
a = three;
b = blind;
c = mice;
d = 6;
}
{
a = larry;
b = moe;
c = curly;
d = 2;
}
Цель состоит в том, чтобы отсортировать массив по элементу "d" , чтобы указанный выше результат был изменен на следующее (основанное на числовом порядке "d" : "2, 5, 6" ):
{
a = larry;
b = moe;
c = curly;
d = 2;
}
{
a = hickory;
b = dickory;
c = dock;
d = 5;
}
{
a = three;
b = blind;
c = mice;
d = 6;
}
Есть и другие вопросы, которые кажутся похожими, но когда вы смотрите на них, становится ясно, что они не обращаются к этому. Благодарим вас за помощь.
Ответы
Ответ 1
Объявить, если вам нужно сохранить его как AnyObject, вы должны явно указать:
var myArray = Array<AnyObject>()
var dict = Dictionary<String, AnyObject>()
dict["a"] = ("hickory" as! AnyObject)
dict["b"] = ("dickory" as! AnyObject)
dict["c"] = ("dock" as! AnyObject)
dict["d"] = (6 as! AnyObject)
myArray.append(dict as! AnyObject)
dict["a"] = ("three" as! AnyObject)
dict["b"] = ("blind" as! AnyObject)
dict["c"] = ("mice" as! AnyObject)
dict["d"] = (5 as! AnyObject)
myArray.append(dict as! AnyObject)
dict["a"] = ("larry" as! AnyObject)
dict["b"] = ("moe" as! AnyObject)
dict["c"] = ("curly" as! AnyObject)
dict["d"] = (4 as! AnyObject)
myArray.append(dict as! AnyObject)
Без добавления вы можете сделать это следующим образом:
var myArray: [AnyObject] = [ ([
"a" : ("hickory" as! AnyObject),
"b" : ("dickory" as! AnyObject),
"c" : ("dock" as! AnyObject),
"d" : (6 as! AnyObject)
] as! AnyObject), ([
"a" : ("three" as! AnyObject),
"b" : ("blind" as! AnyObject),
"c" : ("mice" as! AnyObject),
"d" : (5 as! AnyObject)
] as! AnyObject), ([
"a" : ("larry" as! AnyObject),
"b" : ("moe" as! AnyObject),
"c" : ("curly" as! AnyObject),
"d" : (4 as! AnyObject)
] as! AnyObject)
]
Это дает вам тот же результат. Хотя, если нужно изменить только объект значения в словаре, вам не нужно выделять элементы массива:
var myArray: [Dictionary<String, AnyObject>] = [[
"a" : ("hickory" as! AnyObject),
"b" : ("dickory" as! AnyObject),
"c" : ("dock" as! AnyObject),
"d" : (6 as! AnyObject)
], [
"a" : ("three" as! AnyObject),
"b" : ("blind" as! AnyObject),
"c" : ("mice" as! AnyObject),
"d" : (5 as! AnyObject)
], [
"a" : ("larry" as! AnyObject),
"b" : ("moe" as! AnyObject),
"c" : ("curly" as! AnyObject),
"d" : (4 as! AnyObject)
]
]
Затем, чтобы сортировать, вы используете закрытие sort(), которое сортирует массив на месте. Закрытие, которое вы поставляете, принимает два аргумента (с именем $0 и $1) и возвращает Bool. Закрытие должно возвращать true, если $0 упорядочено до $1, или false, если это произойдет. Для этого вам нужно бросить ужасно много:
//myArray starts as: [
// ["d": 6, "b": "dickory", "c": "dock", "a": "hickory"],
// ["d": 5, "b": "blind", "c": "mice", "a": "three"],
// ["d": 4, "b": "moe", "c": "curly", "a": "larry"]
//]
myArray.sort{
(($0 as! Dictionary<String, AnyObject>)["d"] as? Int) < (($1 as! Dictionary<String, AnyObject>)["d"] as? Int)
}
//myArray is now: [
// ["d": 4, "b": "moe", "c": "curly", "a": "larry"],
// ["d": 5, "b": "blind", "c": "mice", "a": "three"],
// ["d": 6, "b": "dickory", "c": "dock", "a": "hickory"]
//]
Ответ 2
var myArray: [AnyObject] = []
var dict:[String: AnyObject] = [:]
dict["a"] = "hickory"
dict["b"] = "dickory"
dict["c"] = "dock"
dict["d"] = 5
myArray.append(dict)
dict["a"] = "three"
dict["b"] = "blind"
dict["c"] = "mice"
dict["d"] = 6
myArray.append(dict)
dict["a"] = "larry"
dict["b"] = "moe"
dict["c"] = "curly"
dict["d"] = 2
myArray.append(dict)
let myArraySorted = myArray.sorted{$1["d"] as? Int > $0["d"] as? Int} as! [[String: AnyObject]]
println(myArraySorted) // [[b: moe, a: larry, d: 2, c: curly], [b: dickory, a: hickory, d: 5, c: dock], [b: blind, a: three, d: 6, c: mice]]"
или
var myArray: [[String:AnyObject]] = []
var dict:[String: AnyObject] = [:]
dict["a"] = "hickory"
dict["b"] = "dickory"
dict["c"] = "dock"
dict["d"] = 5
myArray.append(dict)
dict["a"] = "three"
dict["b"] = "blind"
dict["c"] = "mice"
dict["d"] = 6
myArray.append(dict)
dict["a"] = "larry"
dict["b"] = "moe"
dict["c"] = "curly"
dict["d"] = 2
myArray.append(dict)
let myArraySorted = myArray.sorted{$1["d"] as? Int > $0["d"] as? Int}
println(myArraySorted) // "[[b: moe, a: larry, d: 2, c: curly], [b: dickory, a: hickory, d: 5, c: dock], [b: blind, a: three, d: 6, c: mice]]"
Ответ 3
Я думаю, что вы ищете sortdescriptor в объекте C, это намного проще в быстром, так как тип массива имеет метод sorted
попробуйте этот код, который он работал у меня:
var myArray = Array<Dictionary<String, String>>()
var dict = Dictionary<String, String>()
dict["a"] = "hickory"
dict["b"] = "dickory"
dict["c"] = "dock"
myArray.append(dict)
dict["a"] = "three"
dict["b"] = "blind"
dict["c"] = "mice"
myArray.append(dict)
dict["a"] = "larry"
dict["b"] = "moe"
dict["c"] = "curly"
myArray.append(dict)
println(myArray[0])
println(myArray[1])
println(myArray[2])
var sortedResults = myArray.sorted {
(dictOne, dictTwo) -> Bool in
return dictOne["c"]! < dictTwo["c"]!
};
println(sortedResults);
ИЗМЕНИТЬ
Я изменил тип словаря, потому что увидел, что вы используете только строки. В общем случае с AnyObject все, что вам нужно, это сделать перед сравнением:
var sortedResults = myArray.sorted {
(dictOne, dictTwo) -> Bool in
let d1 = dictOne["d"]! as Int;
let d2 = dictTwo["d"]! as Int;
return d1 < d2
};
println(sortedResults);
Желаем удачи.
Ответ 4
Сортировать массив словаря в Swift 3 и 4
let sortedResults = (userArray as NSArray).sortedArray(using: [NSSortDescriptor(key: "name", ascending: true)]) as! [[String:AnyObject]]
Ответ 5
когда мы анализируем данные, мы можем сортировать с помощью NSSortDescriptor
let dataDict1 = responseDict.valueForKey("Data")
self.customerArray = dataDict1!.valueForKey("Customers") as! NSMutableArray
var tempArray = NSMutableArray()
for index in self.customerArray {
tempArray.addObject(index.valueForKey("Customer") as! NSMutableDictionary)
}
let descriptor: NSSortDescriptor = NSSortDescriptor(key: "name", ascending: true, selector: "caseInsensitiveCompare:")
let sortedResults: NSArray = tempArray.sortedArrayUsingDescriptors([descriptor])
self.customerArray = NSMutableArray(array: sortedResults)
Ответ 6
В Свифте
let mySortedArray = myArray.sorted(by: {(int1, int2) → Bool in return ((int1 как! NSDictionary).value(forKey: "d") как! Int) <((int2 как! NSDictionary).value(forKey: "d") as! Int)//Сортировка значений и возврат к mySortedArray})
печать (mySortedArray)
myArray.removeAllObjects()//Удалить все объекты и повторно использовать их
myArray.addObject(from: mySortedArray)
печать (mySortedArray)
массив словарных значений легко расположить в порядке возрастания. Для этого не нужны циклы.