Tìm giá trị trong một mảng


124

Trong Ruby, làm cách nào để tìm một giá trị trong một mảng?


Xin lỗi vì loại câu hỏi này, tôi là người mới ở đây và tôi đang học cách sử dụng công cụ này, tôi sẽ thử tìm câu trả lời trước khi đăng ở đây.
Lucas Renan

107
Đối với những ai phàn nàn về loại câu hỏi này: vui lòng đọc Câu hỏi thường gặp: 'Không có câu hỏi nào quá tầm thường hoặc quá "người mới"'. Nếu bạn không thích câu hỏi, đừng trả lời nó và để người khác làm. Nếu câu hỏi đã được hỏi và trả lời trên SO, thì chắc chắn, hãy đánh dấu nó là một bản sao. Nhưng không có lý do gì để chê bai những người mới vì là người mới.
Brian Campbell,

Câu trả lời:


117

Tôi đoán rằng bạn đang cố gắng tìm xem một giá trị nhất định có tồn tại bên trong mảng hay không và nếu đúng như vậy, bạn có thể sử dụng Array # include? (Value):

a = [1,2,3,4,5]
a.include?(3)   # => true
a.include?(9)   # => false

Nếu bạn muốn nói điều gì khác, hãy kiểm tra API Ruby Array


1
Tôi sẽ sử dụng chỉ mục Array #, nhưng kiểm tra API Ruby Array là một mẹo hay.
Wylliam Judd

82

Việc sử dụng Array#selectsẽ cung cấp cho bạn một mảng các phần tử đáp ứng các tiêu chí. Nhưng nếu bạn đang tìm cách đưa phần tử ra khỏi mảng đáp ứng tiêu chí của mình, Enumerable#detectthì cách tốt hơn là:

array = [1,2,3]
found = array.select {|e| e == 3} #=> [3]
found = array.detect {|e| e == 3} #=> 3

Nếu không, bạn sẽ phải làm điều gì đó khó xử như:

found = array.select {|e| e == 3}.first

Cảm ơn! Tôi đã biết về Enumerable#selectnhưng đó #detectchính xác là những gì tôi đang tìm kiếm.
Justin Adkins

1
array.select{}sẽ đi qua tất cả các phần tử trong mảng để tìm kiếm những phần tử phù hợp với điều kiện. array.findthay vào đó sẽ trả về phần tử đầu tiên phù hợp với điều kiện. Vì vậy, sử dụng thích hợp hơn array.find{ |e| e == 3 }sau đóarray.select{ |e| e == 3 }.first
Oscar Gonzalez

Tôi nghĩ rằng bạn có nghĩa là .find_index tôi không biết nếu có bất kỳ.find
Ross Attrill

26

Nếu bạn muốn tìm một giá trị từ mảng, hãy sử dụng Array#find:

arr = [1,2,6,4,9] 
arr.find {|e| e%3 == 0}   #=>  6

Xem thêm:

arr.select {|e| e%3 == 0} #=> [ 6, 9 ]
e.include? 6              #=> true

Để tìm xem một giá trị có tồn tại trong Mảng hay không, bạn cũng có thể sử dụng #in?khi sử dụng ActiveSupport. #in?hoạt động cho bất kỳ đối tượng nào đáp ứng #include?:

arr = [1, 6]
6.in? arr                 #=> true

Tôi không thể thấy bất kỳ phần nào Array#findtrong các tham chiếu Ruby. Phải là một thứ Rails vì những người khác đã đề cập đến nó. Hmmm ....
Ross Attrill

1
@Ross Attrill Không, Nó có trong Enumerable, ruby-doc.org/core-2.7.1/Enumerable.html#method-i-find
fangxing

Tôi đã giả định sai rằng ruby-doc hiển thị các phương thức được bao gồm và kế thừa. Bài học quan trọng cho tôi.
Ross Attrill

23

Như thế này?

a = [ "a", "b", "c", "d", "e" ]
a[2] +  a[0] + a[1]    #=> "cab"
a[6]                   #=> nil
a[1, 2]                #=> [ "b", "c" ]
a[1..3]                #=> [ "b", "c", "d" ]
a[4..7]                #=> [ "e" ]
a[6..10]               #=> nil
a[-3, 3]               #=> [ "c", "d", "e" ]
# special cases
a[5]                   #=> nil
a[5, 1]                #=> []
a[5..10]               #=> []

hay như thế này?

a = [ "a", "b", "c" ]
a.index("b")   #=> 1
a.index("z")   #=> nil

Xem sách hướng dẫn .



16

Sử dụng:

myarray.index "valuetoFind"

Điều đó sẽ trả về cho bạn chỉ mục của phần tử bạn muốn hoặc nil nếu mảng của bạn không chứa giá trị.


9

Câu trả lời này dành cho tất cả mọi người nhận ra rằng câu trả lời được chấp nhận không giải quyết câu hỏi như nó được viết hiện tại.

Câu hỏi hỏi cách tìm một giá trị trong một mảng. Câu trả lời được chấp nhận cho biết cách kiểm tra xem một giá trị có tồn tại trong một mảng hay không.

Đã có một ví dụ sử dụng index, vì vậy tôi đang cung cấp một ví dụ bằng cách sử dụng selectphương pháp này.

1.9.3-p327 :012 > x = [1,2,3,4,5]
  => [1, 2, 3, 4, 5] 
1.9.3-p327 :013 > x.select {|y| y == 1}
  => [1]

@MarkThomas vui lòng trích dẫn một phần câu trả lời của tôi mà bạn cho rằng đó là một tuyên bố không chính xác và tôi sẽ sẵn lòng cập nhật nó. Tôi giả định rằng chúng ta đang sử dụng tiếng Anh ở đây (không tạo định nghĩa cho các từ). Và khi hàng nghìn người tìm kiếm "giá trị ruby ​​FIND trong mảng" trên Google, họ thấy câu hỏi này là kết quả đầu tiên, vì vậy tôi chắc rằng tất cả họ đều muốn thực sự nhận được câu trả lời chính xác.
Mike S

1
Hơn nữa, @MarkThomas nếu bạn đúng thì câu hỏi này nên được đóng lại vì trùng lặp với stackoverflow.com/questions/1986386/… , nhưng có sự khác biệt về chức năng giữa "tìm kiếm" và "kiểm tra sự tồn tại" trong một mảng.
Mike S

Tôi dị ứng với những người sống lại các câu hỏi cũ và cung cấp ít hoặc không nhiều nội dung. Điều này xảy ra rất nhiều. Trong trường hợp của bạn, mặc dù selectđã được cung cấp dưới dạng câu trả lời vào năm 2009, nhưng bạn đã cung cấp một đoạn mã mẫu tốt hơn một chút. Vì vậy, sau khi suy nghĩ lại, tôi rút lại những gì đã nói trước đó.
Mark Thomas

8

Tôi biết câu hỏi này đã được trả lời, nhưng tôi đến đây để tìm cách lọc các phần tử trong Mảng dựa trên một số tiêu chí. Vì vậy, đây là ví dụ giải pháp của tôi: sử dụng select, tôi tìm thấy tất cả các hằng số trong Lớp bắt đầu bằng "RUBY_"

Class.constants.select {|c| c.to_s =~ /^RUBY_/ }

CẬP NHẬT: Trong thời gian chờ đợi, tôi đã phát hiện ra rằng Mảng # grep hoạt động tốt hơn nhiều. Đối với ví dụ trên,

Class.constants.grep /^RUBY_/

đã lừa.


1
Trong thời gian chờ đợi, tôi đã phát hiện ra rằng Array # grep hoạt động tốt hơn nhiều. Ngay cả đối với ví dụ trên, Class.constants.grep /^RUBY_/đã thực hiện thủ thuật.
mydoghasworms

1

Cảm ơn đã trả lời.

Tôi đã làm như thế này:

puts 'find' if array.include?(value)

1

Bạn có thể sử dụng các phương thức mảng.

Để xem tất cả các phương thức mảng, hãy sử dụng methodshàm với mảng. Ví dụ,

a = ["name", "surname"] 
a.methods

Bằng cách này, bạn có thể sử dụng phương pháp khác để kiểm tra giá trị trong mảng Bạn có thể sử dụng a.include?("name").

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.