Swift: 如何根据每个项目的 Levenshtein 距离编号排列字典值

Swift: How can the dictionary values be arranged based on each item's Levenshtein Distance number

我有一本这种格式的产品字典

static var RawSearchDict = [String:Product]()

key: "5f3f03271439a18028e8c0ba", value: App.Product(name: "LeapFrog Blues Clues and You! Magenta Learning Watch for Preschoolers", productPrice: 14.84, productImageUrl: "https://i5.walmartimages.com/asr/f3c7354a-5e70-41ba-a03f-3e3f1507822b_1.5f1104bfcda0ce4a6b730d123f90cbb2.jpeg?odnHeight=180&odnWidth=180&odnBg=ffffff")

key: "5f3f460d1439a18028e9fe9c", value: App.Product(name: "Blues Clues & You! Peek-A-Boo Magenta (10-inch feature plush)", productPrice: 24.84, productImageUrl: "https://i5.walmartimages.com/asr/1e26fca6-c880-42e9-8a97-99d4a5198e80.15f4afeead4018d7aed12683ae29242b.jpeg?odnHeight=180&odnWidth=180&odnBg=ffffff")

我想使用用户条目在名为 RawSearchDict 的产品词典中找到最佳匹配,所以我想到使用 Levenshetein 距离数来进行某种匹配和排名。我的想法是

  1. 在RawSearchDict
  2. 中获取每个产品的描述,也就是generatedString
  3. 查找生成的字符串与用户输入的编辑距离数
  4. 创建一个名为 DisplayProductDict 的产品字典,它对产品进行排列,以便具有最低 Lev Dist 编号的产品字符串排在第一位,并首先显示在我的 swiftui 集合视图中。

我能够找出 1 和 2,但我还没有想出一种方法来根据 Lev Dist 编号在字典中排列产品。这是我的代码

编辑 Dist 函数

func levenshteinDist(test: String, key: String) -> Int {
   let empty = Array<Int>(repeating:0, count: key.count)
   var last = [Int](0...key.count)

   for (i, testLetter) in test.enumerated() {
       var cur = [i + 1] + empty
       for (j, keyLetter) in key.enumerated() {
           cur[j + 1] = testLetter == keyLetter ? last[j] : min(last[j], last[j + 1], cur[j]) + 1
       }
       last = cur
   }
   return last.last!
 }

这会获取描述等产品数据,然后调用上面的函数来获取 Lev Dist 编号。

 func getProductData(){
    
    Global.displayProductArry = []
    var pIndexVsLevNum = [Int : Int]()
    for product0 in Global.RawSearchDict{
        let generatedString = product0.value.name.uppercased()
        let productIndex =  Array(Global.RawSearchDict.keys).index(of: product0.key)
        let relevanceNum = levenshteinDist(test: generatedString, key: self.userWordSearch)
        
        pIndexVsLevNum[productIndex!] = relevanceNum
                        
    }
    // sort the dictionary by value
    let sortedTwo = pIndexVsLevNum.sorted {
        return [=13=].value > .value
    }
    let dictLen = sortedTwo.count
   
    
    
  }

我的 SwiftUI 集合视图从 Global.displayProductArry 获取数据。所以我希望最终的产品订单安排在displayProductArry中。最佳匹配优先。

如何根据 Levenshtein 距离编号对字典值进行排序?或者在字典或数组中实现顺序的最佳方法是什么?

您的 pIndexVsLevNum 还应该将原始字典的 key 作为 key 而不是条目的 index。您总是想访问带有 key.

的字典

您最终会得到一个字典,其中包含原始键和代表您现在可以排序到数组中的排序标准的值

Global.displayProductArry = pIndexVsLevNum.sorted {
    return [=10=].value > .value
}

有了它你可以直接访问你的初始字典

for product in Global.displayProductArry {
    print (RawSearchDict[product.key])
}  

类似于:

func getProductData(){
    
  Global.displayProductArry = []
  var pIndexVsLevNum = [String : Int]()
  for product0 in Global.RawSearchDict{
      let generatedString = product0.value.name.uppercased()
      let productIndex = product0.key
      let relevanceNum = levenshteinDist(test: generatedString, key: self.userWordSearch)
        
      pIndexVsLevNum[productIndex!] = relevanceNum
                        
  }
  // sort the dictionary by value
  Global.displayProductArry = pIndexVsLevNum.sorted {
      return [=12=].value > .value
  }
  let dictLen = sortedTwo.count
       
}