【问题标题】:Sorting in Ruby doesn't do what I expect with sub arrays在 Ruby 中排序并没有达到我对子数组的期望
【发布时间】:2020-07-05 03:28:15
【问题描述】:

我正在定义一个方法,它应该采用一个字符串数组,将其分成 2 个单词对并对其进行排序。

但是,排序并没有按照我的预期进行。它将“s”排在“m”之前(对于“my say”这对,它将“say”放在“my”之前)。

def sorted_pairs(array)
  puts "original: #{array}"
  new_array = array.each_slice(2).to_a
  puts "sliced: #{new_array}"
  new_array.sort #this line does nothing?
  puts "sorted: #{new_array}"
  return new_array
end

#test
words = %w(say my name say my name)
puts sorted_pairs(words)

expected: [["my", "say"], ["name", "say"], ["my", "name"]]
     got: [["say", "my"], ["name", "say"], ["my", "name"]]

排序!也不起作用,因为它会根据每对内的元素对对进行排序(而不是对对本身进行排序)。

expected: [["my", "say"], ["name", "say"], ["my", "name"]]
     got: [["my", "name"], ["name", "say"], ["say", "my"]]

【问题讨论】:

  • 如果要对每个子数组进行排序,则使用 map 对每个子数组进行排序。您可能需要使用 sort_by
  • “它将“s”排在“m”之前(对于“my say”这对,它将“say”放在“my”之前)。 ——请仔细看。它不是“随机”排序的。结果只是“说出我的名字,说出我的名字”,所以它显然不是“随机”排序的,它根本没有排序,这是非常不同 来自“随机”。

标签: arrays ruby sorting


【解决方案1】:

您的问题是您正在对父数组进行排序,而不是对其中的各个数组进行排序。请尝试以下操作:

def sorted_pairs(array)
  array.each_slice(2).map(&:sort)
end

sorted_pairs(words)
#  => [["my", "say"], ["name", "say"], ["my", "name"]]

为了清楚起见,我删除了 puts 行,但如果您愿意,请随时保留它们。我还重构了一个单行,因为这样读起来非常简单。

请注意,因为array.each_slice(2) 返回一个枚举器,所以它使用Enumerable#map,而array.each_slice(2).to_a 创建一个不需要的临时数组并使用Array#map

所以,我们正在做的是遍历每对单词(在一个子数组中)并在它们上调用sort,返回排序后的值(使用map)。

这意味着它将比较各个对,而不是像您当前的方法那样将一个子数组与另一个子数组进行比较。

【讨论】:

  • ...因为array.each_slice(2) 返回一个Enumerator,这使用Enumerable#map,而array.each_slice(2).to_a 创建一个不需要的临时数组并使用Array#map
  • “希望这会有所帮助 - 让我知道你的进展情况 :)”。当您尝试提供帮助并保持友好时,请记住 SO 既不是论坛也不是留言板,它就像是编程问答的在线参考书,因此我们以清晰、简洁和无毛茸茸的风格编写问题和答案。
  • 感谢两位,感谢您的反馈。
  • 这对@1990eam 有帮助吗?
【解决方案2】:

我认为这就是你想要的:

new_array = array.each_slice(2).to_a
new_array.sort! {|a, b| a[0] <=> b[0]}

sortsort! 采用一个定义如何排序的块。在这种情况下,我们希望按数组的第一个元素进行排序。 &lt;=&gt; 运算符用于此类情况。


我误解了这个问题。如果我们想对内部数组进行排序,我们可以简单地使用sort map 它,就像@SRack answered

array.each_slice(2).map(&:sort)

【讨论】:

  • 它也不起作用。似乎我必须找到一种方法来对每对中的项目进行排序。 !sort 将根据所述对中的第一个元素对每一对进行排序。
  • 这没有给出正确的输出,它给出:[["my", "name"], ["name", "say"], ["say", "my"]]
  • 我明白我误解了你的规格。那么@SRack 的答案正是你想要的。
  • 请不要在更改文本时使用“编辑”或“更新”标签。相反,只需对其进行编辑,然后添加新信息,如果它最初就在那里,那么在 SO 上,可读性比跟踪更改时间或其顺序更重要;系统维护所有修改的变更信息,如有必要,我们可以查看。
  • @SRack 抱歉,我更新了我的答案以参考您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多