首先,我是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我应该改变它们。不要为此烦恼,其他元素的顺序不正确:)
答案 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)
这是一种方法 - 这是索引0
到Array#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
将接收器传递给给定的块,返回自我;