【问题标题】:Partially sorting an array in Ruby在 Ruby 中对数组进行部分排序
【发布时间】:2014-04-13 01:00:08
【问题描述】:

我试图在排除单词“Other”的情况下按字母顺序对数组数组进行排序,这是我想要在数组末尾的成员。假设数组如下所示:

cities = [["Sidney"], ["Other"], ["Melbourne"]]

简单地说,cities.sort 只需执行以下操作:

[["Melbourne"], ["Other"], ["Sidney"]]

我希望成员按字母顺序排列,最后加上["Other"],如下所示:

[["Melbourne"], ["Sidney"], ["Other"]]

有人可以在这里指出正确的方向吗?

【问题讨论】:

  • 您尝试执行的操作中存在代码异味。如果你想这样做,那么你应该从cities 中排除["Other"],并且每当你想要排序列表时,你应该这样做cities.sort + [["Other"]]
  • @sawa:我同意,但我认为你可以更好地表达它。也许我应该说你有作者的味道?但这不礼貌。
  • 只有一个other吗?如果是这样,那么您就有了答案:将其与排序分开处理。但是如果有otherother2other3等必须在其他所有东西之后独立排序,那么这是你需要解释的另一个问题

标签: ruby arrays sorting


【解决方案1】:
cities = [["Sidney"], ["Other"], ["Melbourne"]]
cities.delete_if { |x| x.first == ("Other") } #remove other from the Array and then sort by the city
cities.sort_by { |x| x.first }.push(["Other"])
#=> [["Melbourne"], ["Sidney"], ["Other"]]

【讨论】:

  • 您的解决方案帮助我解决了我的问题,但为了做到这一点,我必须以不同的方式实施解决方案,因为问题比我最初表示的要复杂。我将在 SO 上创建另一个问题并回答它。我也会给你信用。谢谢。
  • 这是反映我的解决方案答案的 SO 帖子的链接:stackoverflow.com/questions/23043703/…
【解决方案2】:
cities.sort_by do |(city)|
  [city == 'Other' ? 1 : 0,  city]
end
# => [["Melbourne"], ["Sidney"], ["Other"]]

这里发生了一些事情。首先是所谓的destructuring bind|(city)|cities 数组的每个元素本身就是一个数组,我们对该数组的第一个元素感兴趣。这就是 (city) 周围的括号得到的。

接下来是 sort_by 返回一个数组。比较两个数组时,比较两个数组的第一个元素。如果它们相等,则比较第二个元素,依此类推。因此,我们可以使用数组的第一个元素作为主要排序顺序:

city == 'Other' ? 1 : 0

将数组的第二个元素作为二级排序顺序:

city

主排序顺序导致“其他”被放在排序的末尾。否则,元素按城市排序。

【讨论】:

  • 反对票似乎表明这个答案可以改进。可以做些什么让它变得更好?
  • 我撤回了我的反对票。我对您的回答的问题是您还不知道完整的要求,并且您已经解决了一个虚构的问题。但是我有一个习惯,我想纠正对任何不完美的东西投反对票。你的解决方案很好
  • @Borodin 谢谢你,先生。我没有看到您和sawa 看到的模棱两可,但我同意 OP 的问题会得到改进,如果我们知道 OP 想要以这种方式排序的原因,我们可能会建议替代解决方案。
  • @WayneConrad 您的解决方案帮助我解决了我的问题,但为了做到这一点,我必须以不同的方式实施解决方案,因为问题比我最初表示的要复杂。我将在 SO 上创建另一个问题并回答它。我也会给你信用。谢谢。
  • 这是回答我的问题的解决方案 (stackoverflow.com/questions/23043703/…) 的链接。 @WayneConrad 非常感谢您的贡献
猜你喜欢
  • 2015-06-25
  • 2012-07-04
  • 1970-01-01
  • 2011-04-28
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
相关资源
最近更新 更多