2010-01-27 32 views
43

Nếu a là mảng, tôi muốn a.index(a.max), nhưng một cái gì đó giống Ruby hơn. Nó sẽ là hiển nhiên, nhưng tôi đang gặp khó khăn khi tìm câu trả lời ở đâu và ở nơi khác. Rõ ràng, tôi mới với Ruby.Trong Ruby, cách sạch nhất để lấy chỉ số của giá trị lớn nhất trong một mảng là gì?

+2

Tôi nghĩ bạn đã có nó. Có gì không phải là rubylike về điều đó? – Ben

+0

Ben, tôi đang tìm kiếm một cái gì đó như a.max_index. Đoán nó không được tích hợp. –

+1

Thậm chí nếu hàm bạn muốn không được tích hợp, bạn vẫn có thể thêm thành viên '.max_index' vào lớp' Array'. Dưới đây là ví dụ về việc mở rộng 'Chuỗi' hoặc 'Số nguyên' với một thành viên tùy chỉnh: http://www.hawkee.com/snippet/1260/ – bta

Trả lời

99

Đối với Ruby 1.8.7 trở lên:

a.each_with_index.max[1] 

Nó không có một lần lặp. Không hoàn toàn là điều ngữ nghĩa nhất bao giờ hết, nhưng nếu bạn thấy mình làm điều này rất nhiều, tôi sẽ bọc nó trong một phương thức index_of_max.

+0

Ồ. Làm thế nào để làm điều này? –

+2

Đồng ý - cách thức này hoạt động? – bergyman

+0

Aaah, hiểu rồi. each_with_index.max trả về một mảng với phần tử đầu tiên là giá trị và phần tử thứ hai là chỉ mục của nó. Rất tốt, Chuck. – bergyman

2
a = [1, 4 8] 
a.inject(a[0]) {|max, item| item > max ? item : max } 

Ít nhất đó là Ruby-như :)

+0

Chết tiệt! Tôi đã nấu một giải pháp bằng cách tiêm - bạn đánh tôi với nó! ;) – bergyman

+2

Ngoài ra - câu hỏi ban đầu là để có được chỉ mục, do đó, điều này sẽ phải được thay đổi thành: a.inject (0) {| index, num | num> a [index]? a.find_index (num): index} – bergyman

14

Trong ruby ​​1.9.2 tôi có thể làm điều này;

arr = [4, 23, 56, 7] 
arr.rindex(arr.max) #=> 2 
+0

Đây là phiên bản tồi tệ hơn của giải pháp gốc không mong muốn. – MegaTom

6

Dưới đây là những gì tôi đang suy nghĩ để trả lời câu hỏi này:

a = (1..12).to_a.shuffle 
# => [8, 11, 9, 4, 10, 7, 3, 6, 5, 12, 1, 2] 
a.each_index.max_by { |i| a[i] } 
# => 9 
1

Dưới đây là một cách để có được tất cả các giá trị chỉ số của các giá trị tối đa nếu có nhiều hơn một.

Given:

> a 
=> [1, 2, 3, 4, 5, 6, 7, 9, 9, 2, 3] 

Bạn có thể tìm thấy những chỉ số của tất cả các giá trị max (hoặc bất kỳ giá trị nhất định) bằng cách:

> a.each_with_index.select {|e, i| e==a.max}.map &:last 
=> [7, 8] 
1

Chỉ muốn lưu ý một sự khác biệt về hành vi và hiệu suất cho một số các giải pháp ở đây. Các "buộc vi phạm" hành vi của trùng lặp yếu tố tối đa:

a = [3,1,2,3] 
a.each_with_index.max[1] 
# => 3 
a.index(a.max) 
# => 0 

Ra khỏi tò mò tôi chạy chúng cả trong Benchmark.bm (đối với a trên):

user  system  total  real 
each_with_index.max 0.000000 0.000000 0.000000 ( 0.000011) 
index.max 0.000000 0.000000 0.000000 ( 0.000003) 

Sau đó, tôi tạo ra một mới a với Array.new(10_000_000) { Random.rand } và chạy lại thử nghiệm:

user  system  total  real 
each_with_index.max 
    2.790000 0.000000 2.790000 ( 2.792399) 
index.max 0.470000 0.000000 0.470000 ( 0.467348) 

Điều này làm tôi suy nghĩ trừ khi bạn đặc biệt cần chọn chỉ số tối đa cao hơn, a.index(a.max) là lựa chọn tốt hơn.

Các vấn đề liên quan