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

问题描述

我有这种格式产品的字典

static var RawSearchDict = [String:Product]()

键:“ 5f3f03271439a18028e8c0ba”,值:App.Product(名称:“ LeapFrog Blues Clues and You!学龄前儿童的洋红色学习手表”,productPrice:14.84,productimageUrl:“ https://i5.walmartimages.com/asr/ f3c7354a-5e70-41ba-a03f-3e3f1507822b_1.5f1104bfcda0ce4a6b730d123f90cbb2.jpeg?odnHeight = 180&odnWidth = 180&odnBg = ffffff“)

键:“ 5f3f460d1439a18028e9fe9c”,值:App.Product(名称:“ Blues Clues&You!Peek-A-Boo洋红色(10英寸功能长毛绒)”,产品价格: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中获取每个产品描述(即generateString)
  2. 查找与用户输入内容相比,generateString的Levenshetein距离数
  3. 创建一个称为displayProductDict的产品字典,该字典用于排列产品,以使Lev dist编号最低的产品字符串排在最前面,并在我的swiftui集合视图中首先显示

我能够算出1和2,但是还没有想出一种根据Lev 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 $0.value > $1.value
    }
    let dictLen = sortedTwo.count
   
    
    
  }

我的SwiftUI集合视图从Global.displayProductArry获取其数据。因此,我希望最终产品订单在displayProductArry中安排。最佳比赛第一。

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

解决方法

您的pIndexVsLevNum还应将原始字典的key设为key,而不是条目的index。您总是想使用key访问字典。

您将得到一个带有原始键的字典,该字典具有一个代表您可以现在排序到数组中的排序条件的值

Global.displayProductArry = pIndexVsLevNum.sorted {
    return $0.value > $1.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 $0.value > $1.value
  }
  let dictLen = sortedTwo.count
       
}