Bộ Ruby là gì?
Tập hợp là một lớp lưu trữ các mục giống như một mảng…
Nhưng với một số thuộc tính đặc biệt làm cho nó nhanh hơn 10 lần trong các tình huống cụ thể!
Trên hết:
Tất cả các mặt hàng trong một bộ đều được đảm bảo là duy nhất .
Trong hướng dẫn Ruby này, bạn sẽ học:
- Cách và thời điểm sử dụng một bộ vì lợi ích tối đa của bạn
- Sự khác biệt giữa tập hợp và mảng!
- Danh sách các phương pháp tập hợp hữu ích
Hãy bắt đầu!
Ví dụ về bộ Ruby
Tập hợp là một lớp Ruby giúp bạn tạo danh sách các mục duy nhất .
Dưới đây là một ví dụ về cách điều này hữu ích:
Giả sử bạn đang xem qua một danh sách lớn các sản phẩm.
Nhưng có các mục nhập trùng lặp trong danh sách này &bạn chỉ muốn các sản phẩm duy nhất.
Bạn có thể đặt chúng thành một bộ và bộ đó sẽ đảm bảo danh sách sản phẩm của bạn luôn là duy nhất mà không cần thêm bất kỳ công việc nào .
Đây là cách thực hiện điều đó:
require 'set' products = Set.new products << 1 products << 1 products << 2 products # Set: {1, 2}
Một lợi ích khác là việc tìm kiếm danh sách này sẽ rất nhanh :
products.include?(1) # true
Điều này quá nhanh vì tìm kiếm được thực hiện trong thời gian liên tục.
Set vs Array - Hiểu sự khác biệt
Bây giờ bạn có thể tự hỏi…
Sự khác biệt giữa một tập hợp và một mảng là gì?
Một tập hợp không có quyền truy cập trực tiếp vào các phần tử:
products[0] # undefined method `[]'
Đó là sự khác biệt chính.
Nhưng một tập hợp có thể được chuyển đổi thành một mảng bất cứ lúc nào bạn cần:
products.to_a # [1, 2]
Toàn bộ điểm của việc sử dụng một tập hợp là sử dụng hai thuộc tính đặc biệt của nó:
- Thời gian tra cứu nhanh (với
include?
) - Giá trị duy nhất
Nếu bạn cần những thứ này thì một bộ sẽ giúp bạn tăng hiệu suất tốt và bạn sẽ không phải gọi uniq
trên mảng của bạn mỗi khi bạn muốn các phần tử duy nhất.
Đặt so với Điểm chuẩn mảng
Dưới đây là điểm chuẩn để cho bạn thấy sự khác biệt về hiệu suất giữa mảng &tập hợp include?
phương pháp.
# Ruby 2.5.0 set include: 8381985.2 i/s array include: 703305.5 i/s - 11.92x slower
Lý do cho sự khác biệt này là một mảng phải kiểm tra mọi phần tử!
Nếu bạn có một mảng 1 triệu phần tử, nó sẽ kiểm tra 1 triệu phần tử mỗi khi bạn gọi include?
.
Một bộ không nhất thiết phải làm điều đó.
Phương thức bộ Ruby
Có một số phép toán hoặc phương pháp có thể được thực hiện giữa các tập hợp, nếu bạn có kiến thức về toán học, bạn có thể nhận ra chúng.
Người điều hành Liên minh
Một trong những phương pháp tập hợp hữu ích là toán tử liên hợp:
sản phẩmproducts | (1..10) # Set: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Toán tử này cho phép bạn kết hợp tất cả các phần tử duy nhất của hai tập hợp thành một tập hợp.
Btw, điều này hoạt động với bất kỳ đối tượng Enumerable nào, như mảng, phạm vi &hàm băm, không chỉ các đối tượng từ Set
lớp học.
Toán tử Sự khác biệt
Nếu bạn muốn xóa các phần tử của một tập hợp này khỏi tập hợp kia thì đây là phương pháp của bạn.
Đây là một ví dụ :
products - (3..4) # Set: {1, 2, 5, 6, 7, 8, 9, 10}
Người điều hành giao lộ
Và đây là bộ người điều hành nút giao thông:
Set.new(1..3) & Set.new(2..5) # Set: {2, 3}
Điều này cung cấp cho bạn các yếu tố chung trong cả hai tập hợp. 3 toán tử này (liên hợp, chênh lệch &giao nhau) cũng có thể được sử dụng với mảng.
Superset &Subset
Tập hợp siêu đẳng là tập hợp chứa tất cả các phần tử của tập hợp khác .
Bạn có thể kiểm tra xem một tập hợp này có phải là tập hợp thay thế của tập hợp khác hay không.
Như thế này :
Set.new(10..40) >= Set.new(20..30)
Phạm vi 10..40
chứa 20..30
bên trong nó.
Một tập hợp con là một tập hợp được tạo ra từ các phần của một tập hợp khác:
Set.new(25..27) <= Set.new(20..30)
Cách sử dụng các bộ được sắp xếp
Nếu bạn muốn một tập hợp luôn được sắp xếp bạn có thể sử dụng SortedSet
lớp học.
Có một số yêu cầu để sử dụng lớp này:
- Các đối tượng bạn đang thêm vào tập hợp phải triển khai phương thức <=>.
- Các đối tượng phải được so sánh với nhau (so sánh số nguyên với số nguyên hoặc chuỗi với chuỗi)
Đây là một ví dụ:
sorted_numbers = SortedSet.new sorted_numbers << 5 sorted_numbers << 2 sorted_numbers << 1 sorted_numbers # SortedSet: {1, 2, 5}
Đặt hướng dẫn bằng video
Tóm tắt
Bạn đã học cách sử dụng các bộ trong Ruby để có hiệu suất tốt hơn và viết mã dễ dàng hơn. Bạn cũng đã tìm hiểu về sự khác biệt giữa mảng và tập hợp.
Hãy chia sẻ bài viết này nếu bạn thấy nó hữu ích để nhiều người có thể tìm thấy nó 🙂
Cảm ơn vì đã đọc!