Ruby根据多维数组的键对其进行排序 [英] Ruby sort the multidimensional array via their key

查看:26
本文介绍了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_byObject#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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆