2010-11-26 8 views
25

다른 배열에서 주어진 순서로 배열을 정렬하고 싶습니다.루비의 배열을 특정 순서로 정렬하는 방법은 무엇입니까?

EX : 'A', 즉 'B'의 순서에

a.each do |t| 
    # It should be in the order of 'b' 
    puts t 
end 

그래서 출력해야

a=["one", "two", "three"] 
b=["two", "one", "three"] 

는 이제 배열을 정렬 할 배열을 고려

two 
one 
three 

제안 사항이 있으십니까?

+2

그렇듯이이 질문은 의미가 없습니다. 이 예제는 정확히 동일한 값을 가진 두 개의 배열을 보여줍니다 (다른 순서로만). 'b'에있는 순서대로'a'의 원소들을 반복하고 싶다면,'b'를 반복하면 끝납니다 :-) 그래서 더 많은 조건이있을 것입니다. 배열의 원소가 일치하지 않을 수도 있습니다. 당신이 필요로하지만 평등의 종류가 다른 객체들 사이의 "=="이 아닌가? 좀 더 의미있는 예를 보여줍니다. – tokland

답변

45

배열 # sort_by는 사용자가 수행 한 작업입니다. 응답

a.sort_by do |element| 
    b.index(element) 
end 

더 확장 버전을 언급합니다 : ba의 모든 요소를 ​​포함하고 요소는 다음 고유 경우

a=["one", "two", "three"] 
b=["two", "one", "three"] 

lookup = {} 
b.each_with_index do |item, index| 
    lookup[item] = index 
end 

a.sort_by do |item| 
    lookup.fetch(item) 
end 
+1

작은 배열의 경우 가장 간단하지만 문제가 O (n) 인 경우 O (n^2)입니다. – tokland

+0

@tokland Ok. 더 확장 성있는 버전을 제공했습니다. –

+0

정확히 일치하는 매핑 + sort_by를 만듭니다. 나는 아마도'lookup = Hash [b.to_enum.with_index]'라고 쓰겠지만 그게 그저 세부 사항 일 뿐이다. Btw, 질문에 대한 내 의견을 보았 니? OP가 염두에 두었던 것을 기억합니까? – tokland

12

경우

puts b & a 
+0

그 조건이 성립하면'b & a == b'. –

+1

@PanThomakos, 요소를 포함 할 수도 있고 다른 요소를 가질 수도 있습니다. – Nakilon

+1

나는 이것이 효과가 있다고 멋지다고 생각하지만, 여기 내 예약이 있습니다 : "% s {ameba", "horse", "shark" 1. & (교차 설정)을 사용하여 배열을 정렬하면 오도 된 것입니다. 2. 코드가 부서지기 쉽습니다. 목록에 중복 요소가 있거나 크기가 잘못된 경우 코드가 손상됩니다. &의 구현이 요소가 더 이상 정렬되지 않도록 코드가 손상됩니다. –

8

은 가정 a 정렬되어야한다 요소 순서와 관련하여 b

sorted_a = 
a.sort do |e1, e2| 
    b.index(e1) <=> b.index(e2) 
end 

일반적으로이 필드는 양식의 필드 순서대로 ActiveRecord의 오류 메시지를 정렬하는 데 사용됩니다.

+1

'sort_by'를 사용할 수있을 때 왜'sort'를 사용합니까? –

+0

성능. http://ruby-doc.org/core/classes/Enumerable.html#M003120 벤치마킹을 확인하십시오. – Chirantan

+2

내 벤치 마크는'sort'에'N' 초,'sort_by'에 대해'0.07 N' 초 그리고'&'에 대해'0.01 N'을 보여줍니다. – Nakilon

관련 문제