为什么array.sort不能处理从Ruby中的字符串创建的数组?

时间:2011-07-26 16:50:53

标签: ruby

如果我使用

手动创建数组
array = ["2","1","3"]

array.sort将返回数组的排序版本。

但是如果我使用

创建一个数组
array2 = ["213".split(//)]

array2 = []
array2 << "213".split(//)

array2.sort将返回未排序的数组。

为什么这不起作用?阵列的创建方式是否有所不同,如果是,如何?

4 个答案:

答案 0 :(得分:4)

表达式"213".split(//)已经返回一个数组,因此在这两种情况下,您实际上都在创建一个数组,并将整个数据添加为新数组中的第一个元素。

["213".split(//)]                                                    
=> [["2", "1", "3"]]

array2 << "213".split(//)                                            
=> [["2", "1", "3"]]    

注意双括号。对此数组进行排序无效,因为它只包含一个元素(本身就是一个数组)。您想删除周围的括号:

"213".split(//)                                                      
=> ["2", "1", "3"]   

答案 1 :(得分:3)

将array2定义为[“213”.split(//)]。这将数组([“2”,“1”,“3”])放入数组中。输出是:

  
    

array = [“213”.split(//)]
        =&GT; [[“2”,“1”,“3”]]

  

当你尝试对它进行排序时,它会对“更大”的数组进行排序:具有一个元素的数组!
但这很有效:

  
    

array =“213”.split(//)
        =&GT; [“2”,“1”,“3”]     
的Array.sort         =&GT; [“1”,“2”,“3”]

  

答案 2 :(得分:2)

这段代码:

array2 = ["213".split(//)]

创建一个数组,其中一个元素是一个数组。要对您感兴趣的数组进行排序:

array2[0].sort

但是,更有可能的是,您应该删除外部括号以避免创建数组数组。这同样适用于此:

array2 = []
array2 << "213".split(//)

它创建一个空数组,然后添加一个恰好是另一个数组的数组元素。

答案 3 :(得分:1)

在第一种情况下,您要创建一个元素为“2”,“1”和“3”的数组。在第二种情况下,您创建的数组包含一个元素,其元素为“2”,“1”和“3”:

ruby-1.8.7-p334 :003 > array = ["2","1","3"]
 => ["2", "1", "3"]    # Notice that this is an array of three elements
ruby-1.8.7-p334 :001 > array2 = ["213".split(//)]
 => [["2", "1", "3"]]  #...but this is an array of an array of three elements
ruby-1.8.7-p334 :005 > array2 = "213".split(//)
 => ["2", "1", "3"]    # Remove those extra brackets and it's equivalent to the first case.

如果您已经阅读过这篇文章,您可能会发现在第二种情况下,您只是对单个元素数组进行排序并查看该单个元素,该元素未更改。