Сортировка словаря по двойному значению Swift - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть база данных Firebase с географическими названиями и координатами, я извлек их и поместил каждый из них в свои Array, а затем в Dictionary, я хочу, чтобы Dictionary отсортировано по ближайшему местоположению / по наименьшему Double.

Я посмотрел тонны ранее заданных вопросов и просто не могу понять, что я делаю неправильно. Когда я печатаю свой словарь, он упорядочивает их в алфавитном порядке (проверяя (фактические) расстояния, я знаю, что они правильные).

Как бы я заказать по низкому Double?

var placeName = ""
var distanceArray = [Double]()
var nameDistanceDictionary = [String:Double]()

Извлечение данных из Firebase

self.placeName = placeSnap.key

let distanceRound = Double(round(10*distance)/10)
self.distanceArray.append(distanceRound)
self.nameDistanceDictionary = [self.placeName:distanceRound]
print(self.nameDistanceDictionary)


//Prints (example Doubles)
["Ascot": 5.5]
["Birmingham": 1.2]
["Bristol" : 18.6]
["London": 0.3]
["Manchester": 40.2]
["Newcastle": 2.4]

Я пробовал (печатается так же, как указано выше, минус [""]

for (k,v) in (Array(self.nameDistanceDictionary).sorted {$0.1 < $1.1}) {
    print("\(k):\(v)")
    }

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Ваша жизнь была бы намного проще, если бы вы хранили свою модель как struct вместо того, чтобы пытаться взломать Dictionary. Попробуйте что-то вроде этого:

struct Place {
    let name: String
    let distance: Double
}

let places = [Place(name: "Ascot", distance: 5.5),
              Place(name: "Birmingham", distance: 1.2),
              Place(name: "Bristol", distance: 18.6),
              Place(name: "London", distance: 0.3),
              Place(name: "Manchester", distance: 40.2),
              Place(name: "Newcastle", distance: 2.4)]

for place in places.sorted(by: { $0.distance < $1.distance }) {
    print(place.name)
}
0 голосов
/ 13 ноября 2018

Каждый элемент в вашем словаре имеет два свойства: ключ и значение ( подробнее о словаре здесь )

У вас нетсоздать массив из вашего словаря.Просто отсортируйте ваш словарь по значению элемента.

.sorted(by: {$0.value < $1.value})

теперь создайте для каждого цикла и вместо создания k и v просто создайте item, который будет представлять каждый элемент в вашем словаре.

for item in ...

Теперь, если вы хотите напечатать значение, а также клавишу, просто используйте

print(item.value)

и

print(item.key)

Замените целое для каждого цикла:

for (k,v) in (Array(self.nameDistanceDictionary).sorted {$0.1 < $1.1}) {
    print("\(k):\(v)")
}

с этим

for item in nameDistanceDictionary.sorted(by: {$0.value < $1.value}) {
    print("\(item.key):\(item.value)")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...