2016-08-24 48 views
-1

我有一个字典数组,显示如下,我想对它进行排序和存储,以便对象基于'值'像'钥匙?我如何在Swift中执行此操作?谢谢。Swift(Xcode 7.3.1)和使用字典中的值排序

{ 
    Dislike = 0; 
    Like = 5; 
    userName = T; } 
{ 
    Dislike = 0; 
    Like = 0; 
    userName = S; } 
{ 
    Dislike = 0; 
    Like = 10; 
    userName = N; } 
+0

我真的不明白你展示的这个数据结构是什么。这听起来像是一系列字典。是对的吗? – Sweeper

+0

是的,它是一个字典数组。 – NetCod

回答

0

我想这是一个字典数组?

如果是的话,你可以按照如下

//AnyObject in case your number is an NSNumber 
var array: [[String:AnyObject?]] = yourArray 

array.sort{ $0["Like"]!! > $1["Like"]!! } 

基本上它的变异阵列和排序基于“喜欢”键对它们进行排序。

+0

有两件事:(1)''AnyObject'不能用'>'来比较。 (2)'sort'不会改变数组,'sortInPlace'确实。 – Sweeper

+0

1)这就是为什么我做了两次解包。 2)对不起,你说得对。我最近一直在Swift 3工作,我忘了。在Swift 3中它会改变数组。 –

+0

使用sortinplace和它的工作。谢谢。 – NetCod

0

这个数据结构看起来很奇怪,你知道。我认为这是一个[[String: Any]]。它应该这样声明:

let data: [[String: Any]] = [ 
    [ 
     "Dislike": 0, 
     "Like": 5, 
     "username": "T"], 

    [ 
     "Dislike": 0, 
     "Like": 0, 
     "username": "S"], 

    [ 
     "Dislike": 0, 
     "Like": 10, 
     "username": "N"], 
] 

要排序它,只需使用sort函数。在闭包中,应该返回第一个参数是否应该在第二个参数之前排序。在这种情况下,您只想比较与密钥"Like"对应的值。封闭体看起来像这样:(伪代码)

firstParameter["Like"] < secondParameter["Like"] 

正如我所说的,那是伪代码。真正的代码有点复杂:

data.sort { ($0["Like"]! as! Int) < ($1["Like"] as! Int) } 
0

Sweeper和Edder是正确的,它看起来像一个结构数组。您也可以省略分号。

struct s { 
    var Dislike: Int = 0 
    var Like: Int = 0 
    var userName: String = "" 
} 

var myArray = [s]() 
var i = s() 

i.Dislike = 0 
i.Like = 5 
i.userName = "T" 
myArray.append(i) 

i.Dislike = 0 
i.Like = 0 
i.userName = "S" 
myArray.append(i) 

i.Dislike = 0 
i.Like = 10 
i.userName = "N" 
myArray.append(i) 

myArray.sort{$0.Like < $1.Like}