2011-12-28 3 views
1

다음 문제에 대한 최적의 솔루션은 무엇입니까?예제 문자열과 똑같은 배열 정렬

내가

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

나는 또한 내가 요소는 문자열과 같은 순서로되어 있도록 배열을 정렬 할 필요가

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

이 있습니다. 요소는 때때로 함께 그룹화되지만 문자열에있는 것과 같은 방식으로 항상 배열됩니다 (예 : 배열에 'This is'요소가 없으며 'This is').

이 모든 일이 발생합니다. Rails 응용 프로그램에서 데이터베이스 접근 방식을 취하여 데이터베이스에 요소를 저장 한 다음 original_string을 재구성하기 위해 일부 키를 사용하려고 생각했지만 어쩌면 그냥 .sort 트릭을하는 것이 더 낫다. 결과가 반드시 있어야 할 필요는 없다. 배열, 아무것도 될 수 있습니다 ..

모든 입력 주셔서 감사.

P. 이것은 nlp 태그를 포함하여 일부 nlp 운동의 결과이기 때문에.

답변

7
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 
+0

감사) – Stpn

+0

문자열 # 지수는 문자열의 어느 곳에서나 첫 번째 항목을 찾을 수 없습니다 (경우에 고려하지 않고? 그것은 완전한 단어입니다) – tokland

+0

그들은 것입니다. 나는 그 질문을 다시 읽었으며, 그것들은 단어가 지정되지 않았다. 단어가 필요한 경우 부분 문자열을 정규식으로 인용하고 단어 경계 계산자로 둘러싼 다음 사전 일치 길이를 비교하여이를 처리 할 수 ​​있습니다. – Amadan