[ruby] Ruby에서 객체 속성별로 객체 배열을 정렬합니까?
Ruby on Rails에 객체 배열이 있습니다. 객체의 속성으로 배열을 정렬하고 싶습니다. 가능할까요?
답변
대신 sort_by를 사용하는 것이 좋습니다.
objects.sort_by {|obj| obj.attribute}
특히 속성을 계산할 수있는 경우.
또는 더 간결한 접근 방식 :
objects.sort_by(&:attribute)
답변
답변
오름차순 :
objects_array.sort! { |a, b| a.attribute <=> b.attribute }
또는
objects_array.sort_by{ |obj| obj.attribute }
내림차순 :
objects_array.sort! { |a, b| b.attribute <=> a.attribute }
또는
objects_array.sort_by{ |obj| obj.attribute }.reverse
답변
두 속성으로 정렬해야하는 경우, 첫 번째 속성이 두 번째 속성보다 더 중요합니다 (첫 번째 인수가 동일한 경우에만 두 번째 인수를 고려함을 의미 함), 다음과 같이 할 수 있습니다.
myarray.sort{ |a,b| (a.attr1 == b.attr1) ? a.attr2 <=> b.attr2 : a.attr1 <=> b.attr1 }
또는 배열 배열의 경우
myarray.sort{ |a,b| (a[0] == b[0]) ? a[1] <=> b[1] : a[0] <=> b[0] }
답변
<=> 메서드를 재정 의하여 모든 클래스를 정렬 가능하게 만들 수 있습니다.
class Person
attr_accessor :first_name, :last_name
def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end
def <=>(other)
@last_name + @first_name <=> other.last_name + other.first_name
end
end
이제 Person 객체의 배열을 last_name에서 정렬 할 수 있습니다.
ar = [Person.new("Eric", "Cunningham"), Person.new("Homer", "Allen")]
puts ar # => [ "Eric Cunningham", "Homer Allen"] (Person objects!)
ar.sort!
puts ar # => [ "Homer Allen", "Eric Cunningham" ]
답변
위에 게시 된대로 Array # sort가 잘 작동합니다.
myarray.sort! { |a, b| a.attribute <=> b.attribute }
하지만 <=>
해당 속성에 대해 연산자가 구현 되었는지 확인해야 합니다. Ruby 기본 데이터 유형 인 경우 문제가되지 않습니다. 그렇지 않으면 a <b이면 -1을, 같으면 0을, a> b이면 1을 반환하는 구현을 작성하십시오.
답변
더 우아한 objects.sort_by(&:attribute)
, 당신은 .reverse
순서를 전환해야하는 경우에 추가 할 수 있습니다 .