Ruby에서 배열을 정렬하는 것은 쉽습니다!
멋진 알고리즘을 작성할 필요가 없습니다 원하는 결과를 얻을 수 있습니다.
그렇다면 무엇이 필요할까요?
Ruby의 내장 정렬 방법 이해하기
이것 :
- 정렬
- 정렬 기준
- 정렬!
이러한 방법은 어떻게 작동하며 왜 다른가요?
이것이 이 기사에서 알게 될 것입니다.
sort
로 시작하여 배열을 정렬하는 다양한 방법을 배웁니다. 메소드를 찾은 다음 sort_by
를 살펴봅니다. 고급 정렬(여러 값별) 등을 위한 것입니다.
해보자!
정렬 및 정렬 사용법 배우기! 루비 메서드
가장 기본적인 정렬 형식은 Enumerable 모듈에서 정의한 Ruby 정렬 방식으로 제공됩니다.
예시를 보자 :
숫자 =[5,3,2,1]숫자.정렬# [1,2,3,5]
sort
결과와 함께 새 배열을 반환합니다.
정렬된 요소의 배열!
sort!
를 사용하여 "in-place"로 정렬하는 것도 가능합니다. 방법.
즉, 원래 배열이 변경됩니다. 새 항목을 만드는 대신 성능에 좋을 수 있습니다.
sort_by를 사용한 맞춤 정렬
sort_by
사용 보다 고급스럽고 흥미로운 정렬을 할 수 있습니다.
할 수 있습니다 :
- 문자열 길이로 정렬
- 문자열 내용으로 정렬
- 짝수인지 홀수인지에 따라 정렬
sort_by
를 사용하여 이 작업을 수행할 수 있습니다. 메소드 및 루비 블록.
예를 들어 :
strings =%w(foo 테스트 블로그 a)strings.sort_by(&:length)# ["a", "foo", "test", "blog"]
어떻게 작동하나요?
음, sort_by
메소드는 숫자 값을 기대하므로 length
작동합니다.
이것을 이해한다면 이 방법을 사용하여 대문자로 시작하는 단어를 정렬하고 나머지는 제자리에 두는 것과 같은 멋진 일을 할 수 있습니다.
좋아요 :
def sort_by_capital_word(text) text .split .sort_by { |w| w[0].match?(/[A-Z]/) ? 0 :1 } .join(" ")endsort_by_capital_word("calendar 고양이 탭 램프")# "고양이 램프 캘린더 탭"
일반 sort
를 사용하여 사용자 정의 정렬을 수행하는 것도 가능합니다. 블록이 있는 메서드입니다.
예시 :
strings =%w(foo 테스트 블로그 a)strings.sort { |a,b| a.length <=> b.length }# ["a", "foo", "test", "blog"]<블록 인용>
참고 :이 <=>
기호는 "우주선 연산자"라고 하며 클래스에서 구현할 수 있는 방법입니다. 1(보다 큼), 0(같음) 또는 -1(보다 작음)을 반환해야 합니다.
일반적으로 sort_by
를 선호합니다. 의도가 더 명확하기 때문에 읽기가 더 쉽고 조금 더 빠릅니다.
역순으로 정렬
역순으로 정렬하는 것은 어떻습니까?
reverse
을 사용할 수 있습니다. 정렬 후 메서드를 사용하거나 블록을 사용하고 정렬하려는 항목 앞에 빼기 기호를 넣을 수 있습니다.
예를 보여드리겠습니다 :
strings =%w(foo 테스트 블로그 a)strings.sort_by { |str| -str.length }# ["블로그", "테스트", "foo", "a"]
화려하지는 않지만 작동합니다! 🙂
영숫자 정렬
숫자가 포함된 문자열 목록을 숫자로 정렬한다고 가정해 보겠습니다.
좋아요 :
음악 =%w(21.mp3 10.mp3 5.mp3 40.mp3)
기본적으로 이 목록은 원하는 대로 정렬되지 않습니다.
예 :
music.sort# ["10.mp3", "21.mp3", "40.mp3", "5.mp3"]
하지만 sort_by
를 사용하여 이 문제를 해결할 수 있습니다. :
music.sort_by { |s| s.scan(/\d+/).first.to_i }# ["5.mp3", "10.mp3", "21.mp3", "40.mp3"]
정규식(\d+
) 숫자를 일치시킨 다음 첫 번째 숫자(first
)를 얻습니다. ) 및 정수 객체로 변환(to_i
).
Ruby에서 해시를 정렬하는 방법
배열 정렬에 국한되지 않고 해시도 정렬할 수 있습니다.
예 :
해시 ={코코넛:200, 오렌지:50, 베이컨:100}hash.sort_by(&:last)# [[:오렌지, 50], [:베이컨, 100], [:코코넛, 200]]사전>이것은 값을 기준으로 정렬되지만 여기서 흥미로운 사실을 알 수 있습니다. 반환되는 값은 해시가 아닙니다.
해시를 정렬할 때 다차원 배열을 얻습니다.
이것을 다시 해시로 바꾸려면 Array#to_h 메서드를 사용할 수 있습니다.
여러 값으로 정렬
여러 속성을 기준으로 항목을 정렬할 수 있습니다. 즉, 먼저 날짜별로 정렬하지만(예:) 날짜가 같은 항목이 여러 개 있기 때문에 동점입니다.
동점을 깨기 위해 보조 속성을 사용할 수 있습니다.
예 :
Event =Struct.new(:name, :date)events =[]events <여기서 핵심은
sort_by
내부의 배열입니다. 차단합니다.기본 정렬 속성을 배열의 첫 번째 요소로 설정하는 위치(
event.date
) 및 보조 순위 결정 속성(event.name
).QuickSort 구현
재미를 위해 우리 고유의 정렬 방법을 구현해 보겠습니다. 이것은 내장된 정렬 방법보다 느리지만 컴퓨터 과학을 좋아한다면 여전히 흥미로운 연습입니다.
def quick_sort(list) return [] if list.empty? 그룹 =list.group_by { |n| n <=> list.first } less_than =그룹[-1] || [] 먼저 =그룹[0] || [] 보다 큼 =그룹[1] || [] quick_sort(less_than) + first + quick_sort(greater_than)endp quick_sort [3, 7, 2, 1, 8, 12]# [1, 2, 3, 7, 8, 12]빠른 정렬의 개념은 무작위로 하나의 숫자를 선택한 다음 정렬할 목록을 두 그룹으로 나누는 것입니다.
한 그룹은 선택한 숫자보다 작은 숫자이고 다른 그룹은 선택한 숫자보다 큰 숫자입니다.
그런 다음 목록이 정렬될 때까지 이 작업을 반복합니다.
벤치마크
성능 측면에서 이러한 모든 정렬 방법을 서로 비교하는 방법을 살펴보겠습니다.
루비 2.4.0 :
sort!:1405.8 i/s 정렬:1377.6 i/s - same-ish:차이가 오류 내에 속함 sort_by reverse:196.6 i/s - 7.15x 더 느린 sort_by:183.7 i/s - 7.65x 더 느린 sort_by 마이너스:172.3 i/s - 8.16배 느린 블록 정렬:164.1 i/s - 8.57배 느림보시다시피 일반
sort
메소드는sort_by
보다 훨씬 빠릅니다. 하지만 블록을 사용하지 않는 한 유연하지 않습니다.동영상
요약
sort
사용법을 배웠습니다. &sort_by
다양한 방법으로 배열 및 해시를 정렬하는 방법. 또한 성능 차이와 퀵 정렬 알고리즘을 구현하는 방법에 대해서도 배웠습니다.기억해야 할 사항 :
sort
을 사용할 수 있습니다. 배열, 해시 또는 다른 Enumerable 객체에 대한 메소드 및 기본 정렬 동작을 얻습니다(<=>
기반 정렬 연산자)sort
을 사용할 수 있습니다. 한 객체가 다른 객체와 어떻게 다른지 정의하기 위해 블록 및 두 개의 블록 인수 사용(블록은 1, 0 또는 -1을 반환해야 함)sort_by
를 사용할 수 있습니다. 블록과 하나의 인수를 사용하여 정렬 기준으로 사용할 각 개체에 대해 하나의 속성(배열 길이, 개체 속성, 인덱스 등)을 정의합니다. 블록은 정렬된 배열에서 개체의 위치를 결정하는 정수 값을 반환해야 합니다.이 게시물을 공유하는 것을 잊지 마세요. 그래서 더 많은 사람들이 배울 수 있습니다. 🙂