Ruby根据多维数组的键对其进行排序 [英] Ruby sort the multidimensional array via their key
本文介绍了Ruby根据多维数组的键对其进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望对数组进行排序,以按升序或降序进行排序。 我的数组包含散列键,我想要排序的值是浮点数、整型和字符串(名称)。名称可以是字母或字母数字。我想创建一个处理所有排序的方法。它将接受数组、列名和排序顺序,并返回排序后的数组的其余部分。 以下是JSON输出。我的数组包含哈希键。
[
{
"sid": "101",
"snumber": "798798",
"name": "Anita 1",
"time": 1800,
"count": 32,
"hour": "",
"avg": 1
},
{
"sid": "160",
"snumber": "6546546",
"name": "Anita 22",
"time": 1300,
"count": 30,
"hour": "1",
"avg": 1
},
{
"sid": "120",
"snumber": "6546546",
"name": "Anita",
"time": 2300,
"count": 10,
"hour": "2",
"avg": 2
}
]
我试了很多方法,但什么都做不好。以下是我的方法:
def self.sort_by_alphabets(arr, sortColumnName, sortOrder) # sortOrder a: ASC,d: DESC
column = sortColumnName.to_sym
return arr.sort_by { |h|
if sortColumnName == 'sid' || sortColumnName = 'snumber' || sortColumnName =='hour'
a = h[column].to_i
else
if h[column].is_a? String
a = h[column].to_s
type ='s'
elsif h[column].is_a? Float
a = h[column].to_f
type ='f'
else
a = h[column].to_i
type ='i'
end
if sortOrder == 'a'
a.downcase
else
a.upcase
end
}
end
有人能帮我吗?
预期输出是排序数组。假设我想使用sid
以升序对一个数组进行排序,那么结果数组将按照前面提到的顺序按sid排序,对于其他键也是如此。但是,一次只能在任何一个键中对数组进行排序。
推荐答案
代码
def sort_by_value(arr, key, ascending = true)
arr.sort_by do |h|
v = h[key]
raise TypeError, "#{v}.class => #{v.class} invalid" unless
(v.kind_of?(Numeric) && !v.is_a?(Complex)) || v.is_a?(String)
Float(v) rescue v.downcase
end.tap { |a| a.reverse! if ascending == false }
end
请参阅Enumerable#sort_by、Object#kind_of?和Kernel#Float。
我假设当值是表示数值(不是复数)的字符串时,将对关联的数字进行排序。Float(v)
尝试将字符串v
转换为浮点型。如果成功,它返回Float;否则它引发一个被拯救的异常(在行中),导致返回v.downcase
。
示例
arr = [
{ "name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=> "79", "fnbr"=>"-2.31" },
{ "name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=> "654", "fnbr"=>"12.4" },
{ "name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2" }
]
sort_by_value(arr, "name")
#=> [{"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79","fnbr"=>"-2.31"}
# {"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654","fnbr"=>"12.4"},
# {"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654","fnbr"=>"-1284e-2"}]
sort_by_value(arr, "name", false)
#=> [{"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"},
# {"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"}]
sort_by_value(arr, "time")
#=> [{"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"}]
sort_by_value(arr, "time", false)
#=> [{"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"}]
sort_by_value(arr, "wt")
#=> [{"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"}]
sort_by_value(arr, "wt", false)
#=> [{"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"}]
sort_by_value(arr, "inbr")
#=> [{"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"}]
sort_by_value(arr, "inbr", false)
#=> [{"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"}]
sort_by_value(arr, "fnbr")
#=> [{"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"}]
sort_by_value(arr, "fnbr", false)
#=> [{"name"=>"Anita 22", "time"=>13, "wt"=>-12.4, "inbr"=>"654", "fnbr"=>"12.4"},
# {"name"=>"Anita 1", "time"=>18, "wt"=>2.31, "inbr"=>"79", "fnbr"=>"-2.31"},
# {"name"=>"bubba", "time"=>23, "wt"=>12.84, "inbr"=>"-654", "fnbr"=>"-1284e-2"}]
这篇关于Ruby根据多维数组的键对其进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文