gpt4 book ai didi

ruby - 完全像示例字符串一样对数组进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 17:17:55 26 4
gpt4 key购买 nike

以下问题的最佳解决方案是什么?

我有

original_string = "This is a string that I am trying to sort"

我也有

array_to_sort = ['sort', 'string', 'This is', 'I', 'trying to', 'am', 'a'] 

我需要对数组进行排序,以便元素的顺序与字符串中的顺序相同。元素有时会组合在一起,但总是与它们在字符串中的方式相同(即数组中不能有“is This”元素,只有“This is”)。

所有这一切都发生在 Rails 应用程序中,所以我想也许采用数据库方法并在数据库中保存元素,然后使用一些键来重建 original_string.. 但也许只是做一些 .sort 技巧更好..结果不一定必须是数组,可以是任何东西..

感谢任何输入。

附言包括一个 nlp 标签,因为这是一些 nlp 练习的结果。

最佳答案

array_to_sort.sort_by { |substr| original_string.index(substr) }

结果是一个新数组,按子字符串在原始字符串中的位置排序。

如果您想就地排序(通过更改原始数组),您可以改用sort_by! 方法。

显然,检测 double 太愚蠢了(即 "I am what I am", ["I am", "I am", "what"] 不会按希望排序).

编辑让它不那么愚蠢并不是那么微不足道:

def get_all_positions(str, substr)                                                                                                                                                                                           
pattern = Regexp.new('\b' + Regexp::escape(substr) + '\b')
result = []
pos = -1
while match = pattern.match(str, pos + 1)
pos = match.offset(0)[0] + 1
result << pos
end
result
end

def sort_array_according_to_string(arr, str, i=0, positions=nil)
positions ||= Hash.new
if i < arr.count
current = arr[i]
current_positions = get_all_positions(str, current)
result = []
current_positions.each do |pos|
if !positions[pos]
positions[pos] = [pos, i, current]
result += sort_array_according_to_string(arr, str, i + 1, positions)
positions.delete(pos)
end
end
else
sorted = positions
.values
.sort_by { |position, i| position }
.map { |position, i| arr[i] }
result = [sorted]
end
if i == 0
result.uniq!
end
result
end

original_string = 'this is what this is not'
example_array = ['this', 'is', 'is not', 'what', 'this']
solution = sort_array_according_to_string(example_array, original_string)
puts solution.inspect

关于ruby - 完全像示例字符串一样对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8661436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com