2015-05-04 3 views
0

Я работаю над ios app by swift!Переупорядочить массив словаря по быстрому

Мне нужно отобразить данные из массива словаря по цене. Как я могу изменить порядок этот массив

(
     { 
     price = 269600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 294600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 1345600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 287600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 1344600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 1343600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 1333600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 1332600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 1322600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 322600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 302600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 300600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 291600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 282600; 
     userid = "facebook:851661711521620"; 
    }, 
     { 
     price = 299600; 
     userid = "facebook:851661711521620"; 
    } 
) 

быть отсортированы по цене от самого высокого до самого низкого уровня? мне нужно, чтобы отобразить данные, чтобы быть, как это

enter image description here

Любые идеи, как я могу сделать это спасибо!

Спасибо!

Отредактировано, добавьте фактический код.

self.currentBidDict = snapshot.value["current_bid_id"] as! NSDictionary 

for(var i = 0;i <= self.currentBidDict.count - 1;i++){ 
    self.currentBidDictReOrder.insertObject(self.currentBidDict.allValues[i], atIndex: 0) 
    println(self.currentBidDictReOrder) 
} 

Тогда после того, как я напечаталIn, я получил массив выше в вопросе.

ответ

2

Вы можете использовать функцию sort следующим образом:

var dict = [[ 
     "price" : 1111, 
     "userid" : "facebook:851661711521620" 
     ], 
     [ 
     "price" : 12222, 
     "userid" : "facebook:851661711521620" 
     ], 
     [ 
     "price" : 144444, 
     "userid" : "facebook:851661711521620" 
     ]]  

// sort by price 
dict.sort { 
    x, y in 
    let item1 = x["price"] as! Int 
    let item2 = y["price"] as! Int 
    return item1 > item2 
} 

И результат должен быть таким:

[[price: 144444, userid: facebook:851661711521620], [price: 12222, userid: facebook:851661711521620], [price: 1111, userid: facebook:851661711521620]] 

Я надеюсь, что это поможет вам.

+0

Не будет ли сортировать (словарь) {$ 0.0 <$ 1.0} 'достаточно? Нет никакой реальной необходимости давать им имена, бросать их в Int и сравнивать их нет? – Eendje

+0

@JacobsonTalom Если вы делаете то, что сказали, то у вас есть ошибка компиляции, подобная этой 'Невозможно найти перегрузку для 'sorted', которая принимает список аргументов типа '([Словарь ], (_, _) - > _) '', потому что функция' sort', 'sorted' не знает, как внутри находятся элементы. Попробуйте это для себя –

+0

его поздно, я должен ложиться спать ..: p Плохо. – Eendje

3

Существует функция, sort, которая принимает любую последовательность и возвращает отсортированный массив. Так как словари представляют собой последовательности из (key,value) пар, вы можете передать словарь для сортировки.

Если то, что вы проходите, естественно не сортируется (т. Е. Элементы последовательности: Comparable, в которых нет словарей), вам также необходимо указать замыкание, указывающее sort, как заказать элементы. В вашем случае вы хотите, чтобы это закрытие сравнивало значение для определенного ключа в словарях.

Наконец, вы хотите отсортировать по значению, но поиск ключа в словаре возвращает необязательный (поскольку ключ может отсутствовать). Но, это прекрасно! Поскольку у опций есть оператор <, который работает, до тех пор, пока то, что содержит опциональный, сопоставимо. Кроме того, похоже, что у вас есть словарь Any или AnyObject (потому что у вас есть как цепочки, так и целые числа), поэтому вам придется скрывать их до того, что вы можете сравнить.

Соберем все вместе и:

sorted(dict) { ($0["price"] as? Int) > ($1["price"] as? Int) } 

Вы можете настроить, что as? немного в зависимости от того, что на самом деле содержит ваш словарь. Кроме того, я бы настоятельно предложил посмотреть на создание более строго типизированной структуры и заполнить ее вашими данными, а не оставлять в форме словаря.

+0

Я получил перегрузку для «отсортированного», который принимает список аргументов типа –

+0

. Вам нужно опубликовать реальный код, невозможно сказать вам точный синтаксис, не зная реальных вовлеченных типов. –

+0

уже добавьте реальный код. –

Смежные вопросы