【问题标题】:How do I sort through this array in the way I want?如何以我想要的方式对这个数组进行排序?
【发布时间】:2012-11-06 06:30:57
【问题描述】:

假设我有一个这样的数组:

[["bham", "php"],
 ["auburn", "php"],
 ["bham", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["mobile", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["tucson", "php"],
 ["tucson", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"],
 ["phoenix", "php"]]

我想做一些事情:

  1. 计算将php 作为第二个元素的数组的数量 - 因此 `["bham", "php"] 将计为 1。
  2. 计算第一个元素在整个列表中出现的次数。即bham 在整个数组中出现了多少次,auburn 出现了多少次等等。所以基本上,我想循环遍历这个二维数组,对于每个孩子的第一个元素,我想检查看看我是否已经记录了这个字符串 - 如果有,我会增加记录的值,如果没有,我会为这个新字符串创建一个新条目。

这个特定的数组比较简单,可以在视觉上相对容易地完成,但假设我将有一个包含成百上千个元素的数组。

还可以安全地假设每个子数组的两个元素始终是一个单词 - 所以它应该相对容易跟踪。

我该如何处理?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    数数很简单:

    a.count{|x| x[1] == 'php'}
    #=> 24
    

    对于分组怎么样 group_by:

    a.group_by{|x| x[0]}.map{|k,v| [k,v.size]}
    #=> [["bham", 2], ["auburn", 1], ["phoenix", 18], ["mobile", 1], ["tucson", 2]]
    

    【讨论】:

    • 啊,我以为size 占用了一个块并打算在我的答案中使用它,但后来意识到它没有,但我想只有count 这样做,这就是我的想法. +1
    • 我喜欢这个...不过我有一个问题。你能解释一下group_by。比如,你为什么要先对它们进行分组(我知道你是按第一个元素对它们进行分组的)——如果你没有对它们进行分组,地图功能仍然可以工作吗?那你能解释一下map的作用吗?更具体地说,v.size 如何知道递增?我知道 v 局部变量映射到块中数组中的第二个元素。我只是对 v.size 感到好奇,因为它完全按照我的意愿去做。
    • 在 irb 中自己尝试一下:a.group_by{|x| x[0]} - 它返回一个散列,其中 grouped_by 值作为键,匹配数组作为值。 v.size 只是应用于匹配数组的 Array#size。
    • 我确实是先在 irb 中完成的,然后看到了输出,然后我阅读了 Ruby 文档中的定义 - 但我错过了指示哈希的 hashrocket。我以为我只是看到了一个数组数组,比如输入。这就是为什么我对map 方法如何产生该结果感到有些困惑。但是现在我看到了正确的输出,这完全有道理。好的..非常感谢孟!
    【解决方案2】:

    计算以php为第二个元素的数组个数

    map 只获取最后一个元素,然后select 只获取我们关心的那些,并获取大小:

    array.map(&:last).select { |s| s == 'php' }.size
    #=> 24
    

    计算第一个元素在整个列表中出现的次数

    map 只获取第一个元素,然后对其进行迭代,构建一个哈希来存储计数:

    array.map(&:first).each_with_object(Hash.new(0)) { |s, h| h[s] += 1 }
    #=> {"bham"=>2, "auburn"=>1, "phoenix"=>18, "mobile"=>1, "tucson"=>2}
    

    【讨论】:

    • 谢谢...不过我更喜欢 pguardiario 的解决方案 - 看起来更优雅。但我赞成你的细节和努力。非常感谢您抽出宝贵时间:)
    猜你喜欢
    • 2010-10-27
    • 2018-02-11
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多