2016-08-24 2 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"]!! } 

в основном он мутирует массив и сортировка на основе «Like» ключ.

+0

Две вещи: (1) 'AnyObject' не может сравниваться с помощью'> '. (2) 'sort' не мутирует массив,' sortInPlace' делает. – Sweeper

+0

1) Вот почему я делаю двойной разворот. 2) Извините, что вы правы. В последнее время я работаю с Swift 3, и я забыл. В Swift 3 он мутирует массив. –

+0

использовали сортировку, и это сработало. Благодарю. – 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 and 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} 
Смежные вопросы