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 距离数来进行某种匹配和排名。我的想法是
- 在RawSearchDict
中获取每个产品的描述,也就是generatedString
- 查找生成的字符串与用户输入的编辑距离数
- 创建一个名为 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
}
我有一本这种格式的产品字典
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 距离数来进行某种匹配和排名。我的想法是
- 在RawSearchDict 中获取每个产品的描述,也就是generatedString
- 查找生成的字符串与用户输入的编辑距离数
- 创建一个名为 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
}