【问题标题】:Sort array of strings without converting them into integer对字符串数组进行排序而不将它们转换为整数
【发布时间】:2017-07-28 12:46:18
【问题描述】:

我有一个表示整数值的字符串数组:

array = ["0934", "123", "934", "0123"]

我想在不将字符串转换为整数的情况下对数组进行排序。 预期的输出是:

array = ["0123", "123", "0934", "934"]

请建议我如何做到这一点。

【问题讨论】:

  • 考虑到"0123".to_i #=> 123"123".to_i #=> 123,为什么你的“预期输出”在"123" 之前有"0123"
  • 你的排序背后的逻辑是什么?
  • 你的问题有点不清楚。我认为您的意思可能如下:“我想对字符串数组(就地)进行排序,以便如果将结果数组的元素转换为整数,它们将位于numerical order,但我不想转换在排序操作中将字符串转换为整数”。

标签: ruby string sorting


【解决方案1】:

如果您无法在Array#sort_by! 的块中将字符串转换为整数,您可以将字符串向左填充零(使用String#rjust),这样它们的长度都相同,然后对这些填充的字符串进行排序.

n = array.map(&:size).max
  #=> 4
array.sort_by! { |s| s.rjust(n, '0') }
  #=> ["123", "0123", "0934", "934"]

注意

array.map { |s| s.rjust(n, '0') }
  #=> ["0934", "0123", "0934", "0123"]

【讨论】:

  • 谢谢你的回答,这就是我想要的。
【解决方案2】:

我认为这可以解决问题

array.sort_by!(&:to_i)

【讨论】:

  • 但是,我不想把它转换成整数。
  • 您必须将其转换为整数才能比较值并进行排序
  • @Pramod 这就是要求。我不能。
  • 如果 a = ["1", "5", "10", "50"], a.sort = ["1", "10", "5", "50"] , a.sort_by!(&:to_i) = ["1", "5", "10", "50"]
  • @ChiragAgrawal:只是为了说清楚。这不会将数组转换为整数。它只是使用临时整数对数组进行排序,并就地对数组进行排序。数组未转换为整数数组。
【解决方案3】:

就这么简单:

array.sort
# => ["0123", "0934", "123", "934"]

顺便说一句,你的预期答案是错误的。

编辑

好吧,我想我终于明白你的意图了。也就是说,您希望数组按通过将元素读取为浮点数产生的值进行排序,然后按其长度的降序排列。

array.sort_by{|e| [e.to_f, -e.length]}
# => ["0123", "123", "0934", "934"]

拜托,你一开始就需要在问题中这样写。不要指望很多人可以通过阅读字里行间来得出如此重要的要求。

【讨论】:

  • 请再次检查问题,因为预期的输出是 ["0123", "123", "0934", "934"]
  • 我认为 OP 希望排序后的字符串 s 处于 s.to_i 顺序,但不想在排序操作中将字符串转换为整数。
  • @CarySwoveland 这与 OP 不想转换为整数的说法相矛盾。
  • @ChiragAgrawal 不,我不会再检查它了。我已经检查了很多次了。正如我所写,您的预期输出是错误的。否则,在排序后面写下你的逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多