2017-03-08 39 views
-2

我有表达整数值字符串数组:字符串数组排序没有它们转换成整数

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

我想不转换字符串成整数数组排序。 预期的输出是:

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

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

+0

考虑到''0123“.to_i#=> 123'和'”123“.to_i#=> 123',为什么你的”预期输出“在”123“'前面有'0123'? –

+1

你的分类背后的逻辑是什么? – sawa

+1

你的问题有点不清楚。我认为你的意思可能是这样的:“我想对字符串数组进行排序(就地),以便如果结果数组的元素被转换为整数,它们将以[数字顺序](https://www.reference .com/math/meaning-numerical-order-7099285d76ee357b),但我不想在排序操作中将字符串转换为整数“。 –

回答

4

如果不能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"] 
+0

感谢您的回答,这是我想要的。 –

1

我认为这将这样的伎俩

array.sort_by!(&:to_i) 
+3

但是,我不想将它转换为整数。 –

+0

你必须将它转换成整数来比较值和排序 – Pramod

+0

@Pramod这是什么要求。我不能。 –

1

它是那么容易,因为这样的:

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

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

编辑

好吧,我想我终于得到了你的意图。也就是说,您希望数组按照读取元素所产生的值排序,然后按照长度的降序进行排序。

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

来吧,你需要从第一个地方写这样的问题。不要指望许多人能够通过阅读不同的线路来达到这种不平凡的要求。

+0

请再次检查问题,因为预期的输出是 [“0123”,“123”,“0934”,“934”] –

+0

我认为OP希望排序的字符串's'在's.to_i'顺序,但不希望在排序操作中将字符串转换为整数。 –

+0

@CarySwoveland与OP声明不希望转换为整数的说法相抵触。 – sawa