gpt4 book ai didi

arrays - 在 ruby​​ 中使用宇宙飞船运算符进行自定义排序

转载 作者:数据小太阳 更新时间:2023-10-29 07:20:34 25 4
gpt4 key购买 nike

<分区>

我正在实现自定义排序。有飞船运算符(operator)<=>处理数组排序:

myArray.sort { |a, b| a <=> b }
  • a <=> b返回 1什么时候b大于 a , 并且交换两个元素。
  • a <=> b返回 0什么时候a等于 b , 两个元素留在原来的位置。
  • a <=> b返回 -1什么时候a小于 b , 两个元素留在原来的位置。

所以我测试了一个例子:

myArray = [2, 1, 7, 9, 3, 8, 0]
myArray.sort { |a, b| 1 <=> 1 } # making it always return 0
#=> [9, 1, 7, 2, 3, 8, 0]

结果不是我所期望的。在我的预料中,当飞船运算符(operator)返回时 0 ,每个元素都会留在原来的位置。因为飞船操作符总是返回 0在上面的例子中,数组应该保持原样。但是,结果与原始数组不同。

我有什么误解吗?

更新:

以下是我上述问题的来源。最初我试图按对象的属性对对象进行排序(假设属性为 status )。

例如

myObjects = [obj1, obj2,..., objn] # the objects are ordered by create_time already

myObjects.sort{|a,b|
case a.status
when 'failed'
x = 1
when 'success'
x = 0
when 'pending'
x = -1
end

case b.status
when 'failed'
y = 1
when 'success'
y = 0
when 'pending'
y = -1
end

x <=> y # compare two objects (a and b) by the status
}

myObjectscreated_time 订购已经,但我想按每个对象的 status 再次对其进行排序.

例如,

两个对象具有相同的created time (这里只考虑小时和分钟,忽略秒)将再次按状态排序,使对象带有 failed状态放在数组的末尾。

xy上面代码中的值将取决于对象的状态,和 x y比较决定顺序。如果两个对象的状态相等 ( x == y ),则元素应保持在同一位置,因为它们按 created_time 排序。已经,不需要再对它们进行排序。

当两个对象的状态都是success时, x <=> y将返回 0 .但是根据一些评论,比较值0飞船运算符(operator)返回的似乎输出不可预测的顺序。如果myObjects怎么办包含所有具有相同状态的元素?这将导致飞船运算符(operator)自 x == y 以来一直返回 0 .

在我的期望中,myObjects应该保持相同的顺序,因为状态都是相同的,在我的情况下使用宇宙飞船运算符(operator)时应该如何更正?

非常感谢大家的帮助!

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