gpt4 book ai didi

ruby - 在 Ruby 中对数组的数组进行排序

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

我有一个像这样的数组:

irb(main):028:0> device_array
=> [["name1", "type1", ["A", "N", "N"], ["Attribute", "device_attribute"], 9], ["name2","type2", ["A", "N", "N"], ["Attribute", "device_attribute"], 7]]

我想在第 4 个元素上对整个 device_array 进行排序。

我试过了

AllDevicesController.all_devices.sort do | a,b |
for i in 0..(AllDevicesController.all_devices.length - 1) do
a[i][4] <=> b[i][4]
end
end

我也试过:

AllDevicesController.all_devices.sort do | a,b |
a[][4] <=> b[][4]
end

两种方法都无效。

我用这个作为引用: http://ariejan.net/2007/01/28/ruby-sort-an-array-of-objects-by-an-attribute/

我想我错过了一些让这一切变得非常简单的 ruby 。

最佳答案

您不能使用 <=>nil .

你的代码应该是这样的:

AllDevicesController.all_devices.sort do |a, b|
a[4].nil? ? -1 : b[4].nil? ? 1 : a[4] <=> b[4]
end

这会将没有索引 4 元素的子数组放在结果的开头。反过来,交换 -11 .

你也可以使用 sort_by而不是 sort .我认为这已在 Ruby 1.8.7 中引入(因此如果您使用的是旧版本,它可能无法工作)。它是这样的:

AllDevicesController.all_devices.sort_by { |e| e.nil? ? 0 : e[4] }

这会将没有第 4 个元素的子数组视为 0。更改此常量以适合您。

编辑:

调整输入后,很明显您非常接近正确答案。您的代码应该是:

AllDevicesController.all_devices.sort do |a, b|
a[4] <=> b[4]
end

或简单(假设 Ruby 1.8.7 或更高版本):

AllDevicesController.all_devices.sort_by { |e| e[4] }

在这两种情况下,变量 ab将包含原始数组的元素,这就是为什么您可以直接访问任何位置的元素(并且您不需要类似 a[][4] 的内容,这是不正确的 Ruby 语法)。

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

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