Juwan Park :: .sort 메소드 관련 보충 포스팅

.sort 메소드 관련 보충 포스팅

★프로그래밍/Ruby :: 2016.08.24 12:40

이전에 루비에서 배열 정렬에 사용되는 .sort 메소드에 대해 포스팅을 했습니다.

이 포스트에서는 시간관계상 쓰지 못했던 내용에 대해 보충합니다.

자, 먼저 2차원 배열의 정렬 예입니다.

gfriend = Array.new
gfriend << ["예린", "1996-08-19"]
gfriend << ["엄지", "1998-08-19"]
gfriend << ["신비", "1998-06-03"]
gfriend << ["소원", "1995-12-07"]
gfriend << ["은하", "1997-05-30"]
gfriend << ["유주", "1997-10-04"]

gfriend.sort!

gfriend.each_index do |x|
  puts sprintf("%s", gfriend[x])
end

걸그룹 여자친구의 멤버 이름과 생년월일을 저장하는 배열 gfriend를 만들어 놓고 그 순서는 뒤죽박죽입니다. 그래서 이를 정렬하기 위해 .sort 메소드를 써서 정렬합니다.

["소원", "1995-12-07"]
["신비", "1998-06-03"]
["엄지", "1998-08-19"]
["예린", "1996-08-19"]
["유주", "1997-10-04"]
["은하", "1997-05-30"]

이와 같이 .sort 메소드의 결과로 멤버 이름 가나다순으로 정렬이 되어 있습니다. 배열 gfriend 안은 각 멤버의 이름과 생년월일이 배열 형태로 저장되어 있는데 0번 원소가 이름이고 1번 원소가 생년월일이기 때문에 원소 번호가 앞서는 이름 순서대로 정렬된 것입니다.

그런데 정렬 기준을 멤버 이름이 아니라 생년월일로 하고 싶습니다. 방법이 없을까요? 있습니다.

gfriend = Array.new
gfriend << ["예린", "1996-08-19"]
gfriend << ["엄지", "1998-08-19"]
gfriend << ["신비", "1998-06-03"]
gfriend << ["소원", "1995-12-07"]
gfriend << ["은하", "1997-05-30"]
gfriend << ["유주", "1997-10-04"]

gfriend.sort_by! { |name, bday| [bday, name] }

gfriend.each_index do |x|
  puts sprintf("%s", gfriend[x])
end

9번 줄의 코드가 바뀌었습니다. 원래 .sort 메소드였던 게 .sort_by 메소드로 바뀌어 있고 뒤에 뭔가가 붙어 있습니다. 중괄호 { } 안에 뭔가가 있는데요.
먼저, 앞에 있는 |name, bday| 이것은 정렬 대상이 될 gfriend 배열 안의 배열들에서 0번 원소를 name으로, 1번 원소를 bday로 놓는 의미입니다. 그리고, 그 뒤에 있는 [bday, name] 이것은 앞서 bday로 놓은 1번 원소를 우선 정렬하고 name으로 놓은 0번 원소를 그 다음 기준으로 삼는 의미입니다.

이렇게 해서 실행하면

["소원", "1995-12-07"]
["예린", "1996-08-19"]
["은하", "1997-05-30"]
["유주", "1997-10-04"]
["신비", "1998-06-03"]
["엄지", "1998-08-19"]

원하는 대로 이름이 아닌 생년월일 순서대로 정렬된 것을 알 수 있습니다.

물론 .sort_by 메소드도 느낌표를 붙여 쓸 수도 있고 안 붙여 쓸 수도 있는데, .sort 메소드와 마찬가지로 느낌표를 붙이면 정렬된 결과값이 그대로 원래 배열에 저장되고 느낌표를 안 붙이면 그냥 정렬만 됩니다.

.sort_by 메소드는 다음과 같이 쓰일 수도 있습니다.

:sowon; :yerin; :eunha; :yuju; :sinb; :umji
gfriend = [:sowon, :sinb, :umji, :yerin, :yuju, :eunha]
puts sprintf("%s", gfriend.sort)
puts sprintf("%s", gfriend.sort_by { |x| x.object_id } )
[:eunha, :sinb, :sowon, :umji, :yerin, :yuju]
[:sowon, :yerin, :eunha, :yuju, :sinb, :umji]

이와 같이 .sort 메소드는 심볼도 정렬 가능하지만 정의된 순서와는 달리 알파벳 순서로 정렬이 이루어집니다.
하지만 .sort_by 메소드를 이용해 정렬 기준을 심볼의 알파벳 순서가 아닌 개체 아이디 순서로 하면, 나중에 정의된 심볼일수록 개체 아이디의 숫자가 커지기 때문에 정의된 순서대로 정렬이 가능해집니다.


여기서 sort_by 메소드에 대한 설명을 마칩니다.

많은 도움 되셨나요?

유용한 정보로 활용하시기를 바랍니다.

Today 5    Yday 37    Tot 65,556
Juwan Park
Juwan Park's blog is powered by Daum and TISTORY.
Contemporary Blue for TISTORY.
Designed by Juwan Park. Creative Commons License
▲ TOP