gpt4 book ai didi

ruby - Ruby 中的数组排序

转载 作者:数据小太阳 更新时间:2023-10-29 08:38:18 24 4
gpt4 key购买 nike

我是 Ruby 的新手,我正在努力实现以下目标:我有一个具有两个属性(refers_tois)的对象数组,它们是已经按日期排序。最重要的是,我想对它们进行排序,例如

obj1 < obj2 if obj1.refers_to == obj2.is

这是我到目前为止尝试过的方法,但是:

  • 我很漂亮,这不是“Ruby”的做法。
  • 它甚至不工作:错误 undefined methodsort_by' for #<`(我想我可能与枚举时的变异有关)

    @array.each_with_index do |e,i|
    if e.refers_to != 0
    @array.slice(i+1,@array.count-i-1).each_with_index do |f,j|
    if f.is == e.refers_to
    #@array.insert( ... ) Insert doesn't work
    end
    end
    end
    end

更新:Majioa 的回答

虽然我从那个答案中学到了很多东西,虽然它在摆弄一个小数据集的同时工作,但我现在意识到它不是,我开始认为这个结果不能通过(二进制)排序算法获得.

我的代数是乱序的,所以我将缺乏适当的形式主义,但基本上排序算法所做的是将元素两个两个地比较并相应地移动它们。

让我们使用这个例子:

4, refers_to =>2
3
2
1

当我们达到这个状态时:

3,
2,
4,refers_to =>2
1

在那一点上,我们需要说:如果 4 在正确的位置,不要再移动它,即当比较“4”和“1”时,我们需要知道'2'的状态,因此我的假设:

这是二进制排序无法实现的。

  1. 我说的有道理吗?
  2. 我们可以进行三次排序吗?

最佳答案

我想你应该这样做:

sorted = arr.sort do | obj1, obj2 |
obj1.date < obj2.date && -1 ||
obj1.date > obj2.date && 1 ||
obj1.refers_to == obj2.is && -1 || 0
end

它首先按日期对数组进行排序,当日期相等时,按条件排序。当比较结果为-1时, obj1已放在obj2之前, 如果 1反之亦然。

更新

假设我们有根据您的示例形成的数组:

l = [ [ 1, nil ], [ 2, nil ], [ 3, nil ], [ 4, 2 ] ]

让我们按升序排序:

l.sort do | x, y |
y[ 1 ] && x[ 0 ] <=> y[ 1 ] || x[ 0 ] <=> y[ 0 ]
end

# => [[1, nil], [2, nil], [4, 2], [3, nil]]

或者让我们按降序对它进行排序,但保持数字及其引用的顺序相同:

l.sort do | x, y |
y[ 1 ] && y[ 1 ] <=> x[ 0 ] || y[ 0 ] <=> x[ 0 ]
end

# => [[3, nil], [2, nil], [4, 2], [1, nil]]

关于ruby - Ruby 中的数组排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21052257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com