2012-07-13 9 views
11

Tôi cần trợ giúp về điều gì đó có vẻ đơn giản nhưng gây nhầm lẫn cho tôi. Cố gắng viết một số phương thức đối sánh mờ mà đối phó với sự khác biệt về định dạng giữa giá trị nào được tính khi cần và thực tế có sẵn từ danh sách lựa chọn.cách tìm phần tử phù hợp nhất trong mảng số?

Giá trị (giá tấn công tùy chọn) luôn là Float được tính như 85.0 hoặc Int.

Mảng chứa số ở dạng chuỗi, không thể đoán trước trong hoặc tăng hoặc liệu họ sẽ được hiển thị làm tròn đến một số thập phân (bao gồm cả số không thêm như 5.50) hoặc không có chữ số thập phân (như 85), Eg .:

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 

Tôi không chắc chắn cách viết một dòng đơn giản hoặc hai mã sẽ trả về phần tử đối sánh gần nhất (theo giá trị số) khi nó xuất hiện trong mảng. Ví dụ: nếu select_list.contains? 85.0 trả lại "85"

Đối tượng HTML có văn bản hiển thị (không phải giá trị HTML) là những con số đó; có lẽ có một cách trực tiếp hơn để chỉ gọi browser.select_list(:id, "lstStrike0_1").select X mà không cần phải tìm ra trong Watir làm thế nào để chuyển đổi tất cả những lựa chọn đó thành một mảng Ruby?

+0

Một câu hỏi http://stackoverflow.com/q/6358860/1069375 chiếu sáng cho tôi làm thế nào để dễ dàng chuyển đổi danh sách Watir select_list thành mảng cần thiết: 'selectContent = browser.select_list (: id," lstStrike0_1 "). options.map (&: text)' – Marcos

Trả lời

20
xs = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 
xs.min_by { |x| (x.to_f - 82.4).abs } 
#=> "82.5" 
+0

Cách súc tích nhất tôi thấy. Với mục đích của tôi, giải pháp hoàn chỉnh được kết hợp thành một dòng là '$ browser.select_list (: id," lstStrike0_0 "). Select (strikelist = $ browser.select_list (: id," lstStrike0_0 "). Options.map (&: text)) .min_by {| x | (x.to_f - sigitem [: strikel]). abs} ' – Marcos

5

Tôi không phải là một coder ruby ​​vì vậy đây có thể không phải là cách tốt nhất để làm điều đó

def select_closest(list, target)        
    return (list.map {|x| [(x.to_f - target).abs, x]}).min[1] 
end                

select_list = ["77.5", "80", "82.5", "85", "87.5", "90", "95", "100", "105"] 

puts select_closest(select_list, 81) # yields 80 
+0

Tôi đặc biệt. như bạn đã xem xét các giá trị số không chính xác (81 so với 80 gần nhất) mặc dù tôi đã không đề cập một cách rõ ràng, nhưng có thể xảy ra. Cảm ơn! – Marcos