2013-03-26 4 views
1

В контексте тестирования мне нужно принять определенный процент элементов массива.Ruby, как принять определенный процент элементов массива

Характеристики моего запроса может быть описана в этом тесте:

def test_percent_elements 
    array = [1,2,3,4,5,6,7,8,9,10] 

    assert_equal([], array.percent_elements(0)) 
    assert_equal([1], array.percent_elements(1)) 
    assert_equal([1], array.percent_elements(10)) 
    assert_equal([1,2], array.percent_elements(11)) 
    assert_equal([1,2,3,4,5], array.percent_elements(50)) 
    assert_equal([1,2,3,4,5,6,7,8,9,10], array.percent_elements(100)) 
end 

Какой лучший способ решить эту проблему в Ruby?

ответ

6

Я бы написать:

class Array 
    def percent_elements(percent) 
    take((size * percent/100.0).ceil) 
    end 
end 
+0

Мне нравится один такой лайнер. +1. – Linuxios

+1

или 'take (размер * percent/100.0) .ceil' –

+1

Применил некоторые предлагаемые изменения. Я предпочитаю помещать parens (если не писать некоторые конструкции DSL) – tokland

0

Мой фактический подход заключается в следующем:

class Array 
    def percent_elements(percent) 
    total = self.length 
    elements = ((total * percent)/100.to_f).ceil 
    self[0, elements] 
    end 
end 
+0

Это тот, который вы ищете? значит, вы получили свой ответ? –

+0

В обзоре я бы сказал: 1) Не пишите явные 'self'. 2) Не нужно создавать 'total', так как' length'/'size' уже есть. 3) '100.to_f' ->' 100.0'. 4) 'self [0, elements]' -> 'take (elements)'. 5) Это спорно, подпадает ли этот метод, как достаточно общим, чтобы быть добавлены в 'Array'. – tokland

+0

@iAmRubuuu это был мой первый подход, я искал более красочное решение в качестве принятого ответа. – fguillen

Смежные вопросы