在不使用sort方法的情况下在Ruby中进行简单排序(请注意,要排序的列表是“字符串”)

时间:2014-10-09 17:16:35

标签: ruby arrays sorting

给出

30.02 -88.87 10.58 -99.22 107.33

不使用sort方法进行排序。我花了几个小时没有成功。

def simple_sort(list)      # I have to start with this method

 list = list.split(' ')  # I understand i need to .split to get arrays

因为他们会浮动我需要一种方法来使用to_f方法.each(&:to_f)浮动它我之前看过这个但是我不确定我是否理解" { {1}}&#34 ;.我以为冒号做了物体符号,所以有人请向我解释:吗?

(&:to_f)

这是变得棘手的部分!我从哪里开始?

我想浏览数组中的每个项目,找到最小的数字并将其添加到 sorted_list = [] #thought of creating an empty array to store the new list

sorted_list

而不是使用< =>,这会使这段代码有效吗?

1 个答案:

答案 0 :(得分:3)

打开IRB并尝试:

>> foo = '30.02 -88.87 10.58 -99.22 107.33'
"30.02 -88.87 10.58 -99.22 107.33"
>> foo.split
[
    [0] "30.02",
    [1] "-88.87",
    [2] "10.58",
    [3] "-99.22",
    [4] "107.33"
]

所以split打破了空格上的字符串,到目前为止一直很好。

>> foo.split.each(&:to_f)
[
    [0] "30.02",
    [1] "-88.87",
    [2] "10.58",
    [3] "-99.22",
    [4] "107.33"
]

嗯......价值没有改变,所以each可能没有按照你的想法做。请改为map

>> foo.split.map(&:to_f)
[
    [0] 30.02,
    [1] -88.87,
    [2] 10.58,
    [3] -99.22,
    [4] 107.33
]

将值转换为浮点值后,就可以轻松对它们进行排序。

注意:您可以使用<=>运算符(AKA&#34;太空飞船&#34;)来告诉您一个是小于,等于还是大于另一个,这使得它很容易知道什么时候应该交换它们。例如:

0 <=> 1 # => -1
1 <=> 1 # => 0
2 <=> 1 # => 1

您应该阅读Comparable模块的文档,通过定义<=>(other)方法,可以非常轻松地在类中添加其他功能。

map允许我们修改/转换数组的元素,而each只能迭代它们。您可以使用each来混淆元素,但由于map!可以让您更轻松地转换内容,因此通常不会执行此操作。

关于&:to_f。这是一段时间以来对Ruby的符号的破解,它被添加到Rails中。事实证明它非常有用,它被引入Ruby本身。它被称为&#34;符号来触发&#34;并在&#34; Ruby ampersand colon shortcut&#34;。

中讨论