Tìm phần tử của một mảng Ruby có giá trị lớn nhất cho một thuộc tính cụ thể


83

Có thể có một câu trả lời rất đơn giản cho câu hỏi này, nhưng tôi không thể tìm ra nó vào lúc này. Nếu tôi có một mảng ruby ​​của một loại đối tượng nhất định và tất cả chúng đều có một trường cụ thể, làm cách nào để tìm phần tử của mảng có giá trị lớn nhất cho trường đó?


Câu trả lời:


155
array.max_by do |element|
  element.field
end

Hoặc là:

array.max_by(&:field)

Kiểm tra tài liệu của mô-đun Enumerable để biết thêm các phương pháp hữu ích.
David Grayson

29

Không giúp đỡ à?

my_array.max {|a,b| a.attr <=> b.attr }

(Tôi cho rằng trường của bạn có tên attr)


Vâng, đó chính xác là những gì tôi đang tìm kiếm, đã lùng sục api Array và không tìm thấy gì cả, hãy quên kiểm tra api cho Enumberable, cảm ơn!
Richard Stokes

1
Luôn kiểm tra API Enumerable. Nó có mọi thứ bạn cần bồn rửa trong bếp!
Sahil Muthoo

2
Tôi thích sử dụng hơn max_byvì nó dễ sử dụng hơn: khối chỉ nhận một đối số duy nhất và bạn không phải sử dụng <=>toán tử Spacehip ( ) một cách rõ ràng .
David Grayson

@DavidGrayson Cảm ơn vì thông tin. Tôi không biết sự tồn tại của phương pháp này. Tôi sẽ bình chọn cho nhận xét và câu trả lời của bạn.
p.matsinopoulos

3

Bạn cũng có thể sắp xếp mảng và sau đó nhận giá trị lớn nhất, tối thiểu, giá trị lớn thứ hai, v.v.

array = array.sort_by {|k,v| v}.reverse

puts hash[0]["key"]

2
Nếu bạn chỉ chọn tối thiểu hoặc tối đa, thì các thuật toán sẽ như vậy O(n). Sắp xếp là tối thiểu O(n log n). Không sử dụng điều này trừ khi bạn cần, vì có một số tổn thất hiệu suất không cần thiết.
Jamie,

1
Thật. Sắp xếp là quá mức cần thiết chỉ để đạt được giá trị tối đa. Tôi đã thêm điều này trong trường hợp ai đó muốn nhận được lớn thứ 2, lớn thứ 3, v.v.
Linju
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.