본문 바로가기

개발

루비온 레일즈 - 정렬 sort, sort_by

루비를 쓰다보면 배열을 정렬해야할 일이 많은데 sort, sort_by를 정리해보고자 한다.

 

먼저 기본적인 sort 함수이다.

 

[321].sort # = [1, 2, 3]

 

sort는 오름차순으로 정렬된다. 기본 sort는 default 블록으로 { |a, b| a <=>b } 로 설정된다. sort 함수는 블록에서 두개의 파라미터와 sorting operator <=>를 사용한다.

만약 역순(내림차순)으로 정렬하고 싶으면 다음과 같이 코드를 작성하면 된다.

 

[123].sort { |a, b| b <=> a } # => [3, 2, 1]

 

예제의 코드에서는 루비의 sorting operator인 <=> 가 사용되었는데, 두 개의 파라미터를 받아 0, -1, 1 을 리턴한다.

저 코드에서 b <=> a 일 때

1) b == a이면 0

2) b > a 이면 1

3) b < a 이면 -1 이다.

 

간단하게 역순으로 정렬하고 싶으면 .

 

 

[321].sort.reverse

로 해도 된다.

 

그러면 이제 sort말고 sort_by에 대해서 알아보자.

sort 함수는 블록에 비교 조건을 설정해야하는 반면 sort_by는 블록에 단 하나의 오브젝트 결과 값을 기준으로 정렬한다.

 

 

['hoonki''티송이''3뎃부터시작''clean한'].sort_by{ |item| item.length # => ["티송이", "hoonki", "3뎃부터시작", "clean한"]

 

위 코드를 보면 배열의 아이템의 length를(결과 값) 기준으로 배열이 정렬 된 것을 볼 수 있다. 

 

여태까지는 배열에 대해서 정렬하였는데, 코딩을 하다보면 해시를 정렬하고 싶은 경우가 있다. 키값에 대해서 정렬하고 싶은 경우도 있고, value값에 대해서 정렬하고 싶은 경우도 있다. 

 

우선 해시에 sort 함수를 그냥 적용하면 키값을 기준으로 오름차순으로 정렬된다.

 

{xiaofo:3, teesong:2, hoonki:4, three:1}.sort # => [[:hoonki, 4], [:teesong, 2], [:three, 1], [:xiaofo, 3]]

 

결과 값은 키값으로 오름차술 정렬된 nested array가 나온다. 다른 variant는 블록에서 오퍼레이터 설정을 해주면 자유롭게 가능할 것이다.

sort_by를 통해 해시를 value값에 대해서 정렬하고 싶으면 다음과 같이 할 수 있다.

 

{xiaofo:3, teesong:2, hoonki:4, three:1}.sort_by { |k, v| v } # => [[:three, 1], [:teesong, 2], [:xiaofo, 3], [:hoonki, 4]]
 

 

해시의 k, v중 value를 기준으로 sorting을 하여서, value값 기준으로 정렬된 nested array가 결과 값으로 나온다.

 

반대로 키값을 정렬하고 싶으면 sort_by { |k, v| k }로 하면 된다.