Swift: как отсортировать словарь по значению, но значение является кортежем? - PullRequest
1 голос
/ 07 мая 2020

Swift

Например, у меня есть:

var dict = ["a":(3,2), "b":(9,1), "c":(4,3)]

Я хочу отсортировать по значениям, но конкретно секунда элемент в кортеже.

Я хочу, чтобы после сортировки dict был ниже:

["b":(9,1), "a":(3,2), "c":(4,3)]

Как видите, он отсортирован по второму элементу в кортеже значения.

Я пробовал искать везде, но не могу найти, как этого добиться. Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Перегрузка в стандартной библиотеке слишком беспорядочная.

public extension Sequence {
  /// Sorted by a common `Comparable` value.
  func sorted<Comparable: Swift.Comparable>(
    by getComparable: (Element) throws -> Comparable
  ) rethrows -> [Element] {
    try self.sorted(getComparable, <)
  }

  /// Sorted by a common `Comparable` value, and sorting closure.
  func sorted<Comparable: Swift.Comparable>(
    _ getComparable: (Element) throws -> Comparable,
    _ getAreInIncreasingOrder: (Comparable, Comparable) throws -> Bool
  ) rethrows -> [Element] {
    try sorted {
      try getAreInIncreasingOrder( getComparable($0), getComparable($1) )
    }
  }
}
dict.sorted(by: \.value.1)
0 голосов
/ 07 мая 2020

Словари не упорядочены и не могут быть отсортированы напрямую, но вы можете отсортировать контент, который даст вам массив кортежей значений ключа. Затем этот массив можно сопоставить с массивом ключей, который можно использовать для доступа к словарю в отсортированном виде.

Это будет отсортировано по второму значению в кортеже и вернет массив ключей

let sorttedKeys = dict.sorted(by: { $0.value.1 < $1.value.1}).map {$0.key}

sorttedKeys.forEach {
    print("\($0): \(dict[$0]!)")
}

b: (9, 1)
a: (3, 2)
c: (4, 3)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...