首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按键值对字典的Swift数组进行排序

按键值对字典的Swift数组进行排序
EN

Stack Overflow用户
提问于 2015-05-25 22:26:55
回答 5查看 28K关注 0票数 21

我正在尝试对由字典组成的Swift数组进行排序。我准备了下面的工作例子。目标是按照字典中的"d“元素对整个数组进行排序。我准备了这个工作示例,可以放在Swift项目中:

代码语言:javascript
复制
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])
}

这将导致日志的以下输出:

代码语言:javascript
复制
{
    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'):

代码语言:javascript
复制
{
    a = larry;
    b = moe;
    c = curly;
    d = 2;
}
{
    a = hickory;
    b = dickory;
    c = dock;
    d = 5;
}
{
    a = three;
    b = blind;
    c = mice;
    d = 6;
}

还有一些其他的问题看起来很相似,但是当你看到它们的时候,很明显它们并没有解决这个问题。谢谢你的帮助。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-05-25 22:42:26

要声明,如果需要将其保留为AnyObject,则必须显式强制转换:

代码语言:javascript
复制
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)

无需附加,您就可以这样做:

代码语言:javascript
复制
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)
]

给你同样的结果。尽管,如果只需要更改字典中的值对象,则不需要强制转换数组的元素:

代码语言:javascript
复制
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。如果$0是在$1之前订购的,则闭包应该返回true,如果后面是false,则返回false。要做到这一点,你必须投很多钱:

代码语言:javascript
复制
//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"]
//]
票数 22
EN

Stack Overflow用户

发布于 2018-08-14 10:47:38

Swift 3&4中字典的排序阵列

代码语言:javascript
复制
let sortedResults = (userArray as NSArray).sortedArray(using: [NSSortDescriptor(key: "name", ascending: true)]) as! [[String:AnyObject]]
票数 17
EN

Stack Overflow用户

发布于 2015-05-26 03:44:55

编辑/更新:Xcode 11·Swift 5

代码语言:javascript
复制
var array: [[String:Any]] = []
var dict: [String: Any] = [:]

dict["a"] = "hickory"
dict["b"] = "dickory"
dict["c"] = "dock"
dict["d"] = 5

array.append(dict)

dict["a"] = "three"
dict["b"] = "blind"
dict["c"] = "mice"
dict["d"] = 6

array.append(dict)

dict["a"] = "larry"
dict["b"] = "moe"
dict["c"] = "curly"
dict["d"] = 2

array.append(dict)
代码语言:javascript
复制
let sortedArray = array.sorted { $0["d"] as? Int ?? .zero < $1["d"] as? Int ?? .zero }

print(sortedArray)  // "[[b: moe, a: larry, d: 2, c: curly], [b: dickory, a: hickory, d: 5, c: dock], [b: blind, a: three, d: 6, c: mice]]"
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30446812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档