Рассчитать разницу между элементами массива - PullRequest
16 голосов
/ 12 января 2011

Учитывая отсортированный массив из n целых чисел, например:

ary = [3, 5, 6, 9, 14]

Мне нужно вычислить разницу между каждым элементом и следующим элементом в массиве.Используя приведенный выше пример, я получу:

[2, 1, 3, 5]

Начальный массив может содержать 0, 1 или много элементов, и числа, с которыми я буду работать, будут намного большеиспользовать временные метки эпохи).Я пробовал следующее:

times = @messages.map{|m| m.created_at.to_i}
left  = times[1..times.length-1]
right = times[0..times.length-2]
differences = left.zip(right).map { |x| x[0]-x[1]}

Но мое решение выше не является оптимальным и не идеальным.Кто-нибудь может мне помочь?

Ответы [ 3 ]

41 голосов
/ 12 января 2011
>> ary = [3, 5, 6, 9, 14] #=> [3, 5, 6, 9, 14]
>> ary.each_cons(2).map { |a,b| b-a } #=> [2, 1, 3, 5]

Редактировать: Заменено inject на map.

7 голосов
/ 12 января 2011

Аналогично, но более кратко:

[3, 5, 6, 9, 14].each_cons(2).collect { |a,b| b-a }
1 голос
/ 12 января 2011

Альтернатива:

a.map.with_index{ |v,i| (a[i+1] || 0) - v }[0..-2]

Не работает в Ruby 1.8, где для map требуется блок вместо возврата перечислителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...