2016-08-24 46 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}