본문 바로가기
Developer/Ruby

Ruby Array sort / sort_by / sort! / sort_by! 사용 방법 (루비 배열 정렬 방법)

by 김씩씩 2022. 9. 14.

Ruby Array sort / sort_by / sort! / sort_by! 사용 방법 (루비 배열 정렬 방법) 

 

Ruby의 배열에서 정렬할 때 사용하는 sort / sort_by / sort! / sort_by! 메소드 사용 방법에 대해 알려드리도록 하겠습니다.

 

sort 사용 방법

# 오름차순, 내림차순 정렬 예시
arr1 = [1, -24, 0, 48, -50, 100]

p arr1  # [1, -24, 0, 48, -50, 100]
p arr1.sort # [-50, -24, 0, 1, 48, 100] (오름차순)
p arr1.sort { |a, b| b <=> a } # [100, 48, 1, 0, -24, -50] (내림차순)

# 문자열 사전순 정렬, 문자열 길이 정렬 예시
arr2 = ["안녕하세요", "개발자 김정식", "입니다.", "잘 부탁 드립니다."]
p arr2  # ["안녕하세요", "개발자 김정식", "입니다.", "잘 부탁 드립니다."]
p arr2.sort # ["개발자 김정식", "안녕하세요", "입니다.", "잘 부탁 드립니다."] (사전순 정렬)
p arr2.sort { |a, b| a.length <=> b.length } # ["입니다.", "안녕하세요", "개발자 김정식", "잘 부탁 드립니다."] (문자열 길이 기준 정렬)

# 해시를 요소로 가지는 배열 원하는 키로 정렬 예시
arr3 = [
  {name: "김정식", age: 29}, 
  {name: "박땡땡", age: 31}, 
  {name: "이땡땡", age: 27}
]
p arr3  # [{:name=>"김정식", :age=>29}, {:name=>"박땡땡", :age=>31}, {:name=>"이땡땡", :age=>27}]
p arr3.sort { |a, b| a[:age] <=> b[:age] }  # [{:name=>"이땡땡", :age=>27}, {:name=>"김정식", :age=>29}, {:name=>"박땡땡", :age=>31}]

sort -> new Array

sort { |a, b| 비교 방식 설정 } -> new Array

방식으로 sort를 사용하여 배열을 정리할 수 있습니다.

 

예시를 보면,

숫자로 이루어진 배열에 sort를 사용하면 오름차순으로 정렬됩니다.

Block을 통해 정렬 방식을 변경하여 내림차순으로 결과를 얻을 수 있도록 설정이 가능합니다.

 

문자로 이루어진 배열에 sort를 사용하면 사전순으로 정렬을 합니다.

문자열의 길이로 정렬을 하고 싶다면 정렬 방식을 Block을 사용해 변경이 가능합니다.

 

해시를 요소로 가지는 배열에서 특정 키로 정렬을 하고싶다면 역시 Block을 사용해 정렬 방식을 변경하여 사용하시면 되겠습니다.

 

 

sort_by 사용 방법

# 오름차순, 내림차순 정렬 예시
arr1 = [1, -24, 0, 48, -50, 100]

p arr1  # [1, -24, 0, 48, -50, 100]
p arr1.sort_by { |obj| obj } # [-50, -24, 0, 1, 48, 100] (오름차순)
p arr1.sort_by { |obj| -obj } # [100, 48, 1, 0, -24, -50] (내림차순)

# 문자열 사전순 정렬, 문자열 길이 정렬 예시
arr2 = ["안녕하세요", "개발자 김정식", "입니다.", "잘 부탁 드립니다."]
p arr2  # ["안녕하세요", "개발자 김정식", "입니다.", "잘 부탁 드립니다."]
p arr2.sort_by { |obj| obj } # ["개발자 김정식", "안녕하세요", "입니다.", "잘 부탁 드립니다."] (사전순 정렬)
p arr2.sort_by { |obj| obj.length } # ["입니다.", "안녕하세요", "개발자 김정식", "잘 부탁 드립니다."] (문자열 길이 기준 정렬)


# 해시를 요소로 가지는 배열 원하는 키로 정렬 예시
arr3 = [
  {name: "김정식", age: 29}, 
  {name: "박땡땡", age: 31}, 
  {name: "이땡땡", age: 27}
]
p arr3  # [{:name=>"김정식", :age=>29}, {:name=>"박땡땡", :age=>31}, {:name=>"이땡땡", :age=>27}]
p arr3.sort_by { |obj| obj[:age] }  # [{:name=>"이땡땡", :age=>27}, {:name=>"김정식", :age=>29}, {:name=>"박땡땡", :age=>31}]

 

sort_by { |obj| 비교할 부분 설정 } -> new Array

방식으로 sort_by를 사용하여 배열을 정리할 수 있습니다.

 

Block 없이도 사용이 가능하지만 enumerator 형으로 반환합니다.

 

 

 

sort!, sort_by! 사용 방법

# sort 사용
arr1 = [1, 2, 3, 4, 5]
p arr1      # [1, 2, 3, 4, 5]

new_arr1 = arr1.sort { |a, b| b <=> a }

p arr1      # [1, 2, 3, 4, 5]
p new_arr1  # [5, 4, 3, 2, 1]

new_arr1[0] = 0

p arr1      # [1, 2, 3, 4, 5]
p new_arr1  # [0, 4, 3, 2, 1]


# sort! 사용
arr2 = [1, 2, 3, 4, 5]
p arr2      # [1, 2, 3, 4, 5]

new_arr2 = arr2.sort! { |a, b| b <=> a }

p arr2      # [5, 4, 3, 2, 1]
p new_arr2  # [5, 4, 3, 2, 1]

new_arr2[0] = 0

p arr2      # [0, 4, 3, 2, 1]
p new_arr2  # [0, 4, 3, 2, 1]



# sort_by 사용
arr3 = [1, 2, 3, 4, 5]
p arr3      # [1, 2, 3, 4, 5]

new_arr3 = arr3.sort_by { |obj| -obj }

p arr3      # [1, 2, 3, 4, 5]
p new_arr3  # [5, 4, 3, 2, 1]

new_arr3[0] = 0

p arr3      # [1, 2, 3, 4, 5]
p new_arr3  # [0, 4, 3, 2, 1]


# sort_by! 사용
arr4 = [1, 2, 3, 4, 5]
p arr4      # [1, 2, 3, 4, 5]

new_arr4 = arr4.sort_by! { |obj| -obj }

p arr4      # [5, 4, 3, 2, 1]
p new_arr4  # [5, 4, 3, 2, 1]

new_arr4[0] = 0

p arr4      # [0, 4, 3, 2, 1]
p new_arr4  # [0, 4, 3, 2, 1]

예시에서 확인할 수 있듯이,

일반적으로 sort sort_by를 사용하듯이 sort! sort_by! 를 사용할 수 있습니다.

다만 느낌표를 사용하고 사용하지 않고의 차이는,

느낌표를 사용하지 않으면 sort 메소드를 사용하는 기존의 배열 변수는 변경하지 않고, 정렬이 완료된 새로운 배열을 반환하지만,

느낌표와 함께 사용하면 sort! 메소드를 사용하는 기존의 배열 자체의 값을 변경시키고 해당 배열 자체를 얕은 복사식으로 반환합니다.

 

표현을 한번 해보자면,

sort { |a, b| 비교 방식 설정 } -> new Array

sort! { |a, b| 비교 방식 설정 } -> self

sort_by { |obj| 비교할 부분 설정 } -> new Array

sort_by! { |obj| 비교할 부분 설정 } -> slef

위와 같이 표현해볼 수 있겠습니다!

 

그래서 sort 를 사용한 예시를 보면 sort를 사용한 후 기존 배열 arr1이 변경되지 않은 것과, 반환된 배열을 가지는 변수 new_arr1의 요소를 변경하여도 new_arr1의 값만 변경되었고, arr1의 값은 변경되지 않은 것을 확인하실 수 있습니다.

 

하지만 sort! 를 사용한 예시를 보면 sort!를 사용한 후 기존 배열 arr2도 변경된 값을 가지는 것과, 반환된 배열을 가지는 변수 new_arr2의 요소를 변경하면 new_arr2의 값 뿐만 아니라 arr2의 값도 변경된 것을 확인하실 수 있습니다.

 

그러므로 상황에 맞게 느낌표의 포함 여부를 판단하여 사용하실 수 있습니다.

 

 

이상으로 Ruby의 배열에서 정렬할 때 사용하는 sort / sort_by / sort! / sort_by! 메소드 사용 방법에 대한 설명을 마치도록 하겠습니다.

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청사항은 언제든지 말씀해주세요!

피드백도 언제나 환영입니다!

 

감사합니다.


댓글