Сортировка 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)

массив словарных значений легко расположить в порядке возрастания. Для этого не нужны циклы.