【问题标题】:How to get keys from Array of tuple in Swift如何从 Swift 中的元组数组中获取键
【发布时间】:2021-12-28 08:51:23
【问题描述】:

我从 API 获取字典 [String: Int],按值排序。在那,我得到了一个元组数组,在那个元组数组中,我需要分隔键并希望以相同的排序顺序使用这些键创建一个数组。

我尝试了一种从该数组中获取对象并将其添加到字典中的方法,但它无法正常工作,因为在添加键时或添加键之后字典变得无序,需要帮助来解决此问题

尝试过的代码

let personalInfoDict = screenConfigResponse?.screenConfiguration?.personalInformation
let personalDict : [String : Int]?
if let dict = personalInfoDict, dict.count > 0 {
    personalDict = self.sortWithKeys(dict)
}

func sortWithKeys(_ dict: [String: Int]) -> [String: Int] {
    let sorted = dict.sorted(by: { $0.value < $1.value })
    var newDict: [String: Int] = [:]
    for sortedDict in sorted {
        newDict[sortedDict.key] = sortedDict.value
    }
    return newDict
}

在进行排序时,我得到了正确排序的顺序,但是当我循环并将其添加到 newDict 中时,它是无序的,有没有办法只从元组数组中获取键

【问题讨论】:

  • Dictionary 未排序,这就是您的代码不起作用的原因。毕竟它是键访问,而不是索引访问。现在有一个新对象,它是一个排序字典,它是OrderedDictionary。见advancedswift.com/ordereddictionary/…
  • @Larme 好的,会检查这个,感谢分享这篇文章
  • @Larme 但是,您必须单独添加该包,这不是核心 Swift 的一部分。
  • 是的@Sulthan,有没有其他方法可以做到这一点,而不添加那个包
  • 将键排序到一个新数组中,然后在访问字典时使用该数组

标签: ios arrays swift dictionary tuples


【解决方案1】:

也许你可以把它转换成一个元组数组:

let personalInfoDict = screenConfigResponse?.screenConfiguration?.personalInformation
let personalPairs = personalInfoDict
    .reduce(into: [(String, Int)]()) { $0.append(($1.key, $1.value)) }
    .sorted(by: { $0.0 < $1.0 })

 if let pArray = personalPairs, pArray.count > 0 {
    for obj in pArray {
       personalInformationArray.append(obj.0)
    }
 }

现在你有一个[(String, Int)] 有序数组

【讨论】:

  • 我试过这段代码,我按字母顺序对字典进行排序,但我希望它按值排序,意味着按该整数排序
  • 我将排序用 0.0 更改为 0.1 和 1.0 更改为 1.1,然后它按值排序,现在我只想获取其中的键,在一个单独的数组中,你知道我可以做到那
  • 你为什么要另一个只有钥匙的?它很有可能与personalPairs 不同步。虽然可以做到,但每次你在personalPairs 上执行操作时,你都需要在另一个上反映它...let otherOnes = personalParis.map { $0.0 }
  • @Larme 我的要求是只获得排序的键数组,因为我只用值对该字典进行排序,并尝试在数组中单独获取排序的键。而且,是的,我只是像你建议的那样被其他人得到它,谢谢
  • @iDevid 我通过循环personalPairs得到它,非常感谢。
【解决方案2】:

对于文学词典,有一种哈希表。 但是HashTables不是有序的数据结构,所以你得到的效果是预期的行为。

不过,Apple 提供了一个可选包,可将其他数据结构添加到您的项目中 (https://github.com/apple/swift-collections)。特别是我认为“OrderedDictionary”是您的解决方案。

let baseDict : [String:Int] = ["Test1" : 5,
                                   "Test2" : 1,
                                   "Test3" : 4]

let orderedDict : OrderedDictionary<String, Int> = sortWithKeys(baseDict: baseDict)
print(orderedDict)

func sortWithKeys(baseDict : [String:Int]) -> OrderedDictionary<String, Int>
{
    let temp = baseDict.sorted(by: { $0.value < $1.value })
    var newDict : OrderedDictionary<String, Int> = [:]
    for element in temp {
        newDict[element.key] = element.value
    }
    return newDict
}

【讨论】:

  • 感谢@AntonioWar,上面的答案帮助我在不添加 Swift Collection 的情况下实现了它。感谢您抽出宝贵时间帮助我
猜你喜欢
  • 2014-12-19
  • 2016-09-09
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2021-12-27
  • 2019-05-25
  • 2012-08-09
相关资源
最近更新 更多