array_to_sort.sort_by { |substr| original_string.index(substr) }
Результатом является новый массив, отсортированный по позиции подстроки в исходной строке.
Если вы хотите отсортировать на месте (изменив исходный массив), вы можете использоватьвместо этого используется метод sort_by!
.
Очевидно, что слишком глупо обнаруживать двойные значения (т. е. "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