比较arr中的连续值并根据需要交换它们

时间:2015-12-30 12:31:45

标签: arrays ruby

首先,我是Ruby的新手(几天)。

我试图通过一个数组,检查差异是否大于预期,如果是,我想交换元素。在Java中,我会这样做:

int[] arr = {1, 10, 3, 28, 13};
int curr = 0;
int next = 1;
while (next < arr.length) {
 if (arr[curr] - arr[next] > 10) {
  int temp = arr[curr];
  arr[curr] = arr[next];
  arr[next] = temp;
 }
 curr++;
 next++;
}

在Ruby中有没有一种优雅的方法来实现这一目标?我可以将这段代码翻译成Ruby代码,但在Ruby中这样做有点奇怪。

由于

编辑:我不需要以标准方式对其进行排序。这是我所遇到的问题的简化。数组已经在不同的属性上排序,这只是O(n)中的一个消毒部分。

Edit2:我有一个按id排序的对象数组。这些对象具有另一个属性,例如counter,只需要与邻近对象一起检查。如果计数器之间的差异>的条件是10我应该改变它们。不要为此烦恼,其他元素的顺序不正确:)

3 个答案:

答案 0 :(得分:1)

arr = [1, 10, 3, 28, 13]
arr.each_with_index do |num, index|
  if (index + 1 < arr.size) && (arr[index] - arr[index + 1]) > 10
    arr[index], arr[index+1] = arr[index + 1], arr[index]
  end
end

答案 1 :(得分:1)

这是一种方法 - 这是索引0Array#size - 2的简单迭代,如果条件为真,我们交换元素。

arr = [1, 10, 3, 28, 13]
(0...arr.size - 1).each do |i|
    arr[i], arr[i+1] = arr[i+1], arr[i] if (arr[i] - arr[i+1]) > 10
end
p arr
#=> [1, 10, 3, 13, 28]

答案 2 :(得分:0)

不是就地解决方案:

alertTitle

这里发生了什么:

  • arr.inject是一个reducer,它以空数组开头,并用元素填充;
  • arr = [1, 10, 3, 28, 13] diff = 10 arr.inject([]) do |memo, el| (memo << el).tap do |a| a[-1], a[-2] = a[-2], a[-1] if a.size > 1 && a[-2] - a[-1] > diff end end 将接收器传递给给定的块,返回自我;
  • 下一行交换最后两个元素,如果且只有多个元素,并且它们的差异大于给定值。