【问题标题】:Having trouble with the sort method排序方法有问题
【发布时间】:2014-09-14 18:00:40
【问题描述】:

我正在根据文本文件中的字数构建直方图。我有一个哈希数组,其键是单词,值是单词每行出现的次数。我需要在这个散列数组上使用sort 方法,按照出现次数最多的单词的顺序对值进行排序。这是我的排序线的样子:

twoOfArray.sort { |k, v| v <=> k }
twoOfArray.each { |key, value| puts "#{key} occurs #{value} times" "\n"}

完整代码是here。如果我使用 sort! 方法,我会收到未定义的方法错误。有谁知道为什么?

【问题讨论】:

  • sort 在块中接受两个参数:每个都是原始类型,您的块告诉 sort 如何比较它们。所以应该是twoOfArray.sort { |a1, a2| # do something here to compare hash a1 with hash a2 }。从您的each 声明来看,看起来twoOfArray 本身就是一个哈希,而不是您所指出的哈希数组?因此,您正在尝试将 sort 应用于未定义的哈希。
  • 请编辑以在您的问题中包含“完整代码”。问题应该能够在链接中断后继续存在。
  • @lurker 所以我的“twoOfArray”实际上只是一个哈希?因此,如果它只是一个哈希,那么我该怎么做才能对其进行排序呢?
  • 在应用sort 时,Ruby 会在内部将散列转换为一个小型 2 元素数组的数组,并且根据给出的答案,需要相应地应用 sort 方法通过@StewartNelson。但是请记住,如果将其转换回哈希,则不能保证其顺序。哈希不是数组那样的有序数据类型。
  • bag.select 返回什么?我认为 select 只需要 1 个参数,而不是 kv

标签: ruby sorting


【解决方案1】:

我会将您的数据结构(散列数组)转换为一个大散列。如果您想对单词进行排序,没有理由将它们放在单独的哈希中。

然后,如果您的哈希值类似于 {'the' =&gt; 5, 'and' =&gt; 23, 'beer' =&gt; 2},您可以通过以下方式排序:

> h = {'the' => 5, 'and' => 23, 'beer' => 2}
> a = h.sort {|a, b| b[1] <=> a[1] } # sort converts a hash into an array of arrays.
> a
#=> [['and', 23], ['the', 5], ['beer', 2]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多