Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby에서 배열 및 해시를 정렬하는 방법(예제 포함)

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를 사용할 수 있습니다. 블록과 하나의 인수를 사용하여 정렬 기준으로 사용할 각 개체에 대해 하나의 속성(배열 길이, 개체 속성, 인덱스 등)을 정의합니다. 블록은 정렬된 배열에서 개체의 위치를 ​​결정하는 정수 값을 반환해야 합니다.

이 게시물을 공유하는 것을 잊지 마세요. 그래서 더 많은 사람들이 배울 수 있습니다. 🙂