在不改变原始数据的情况下排序数组元素的方法?

时间:2015-04-10 16:23:51

标签: ruby

所以,我试图定义一个方法#my_array_sorting_method,它将数组(源)作为输入并获取数组的元素(整数和字符串)并按字母顺序排序并显示,所有这一切都没有改变原来的阵列结构。这就是我到目前为止所做的:

def my_array_sorting_method(source)
   source.sort_by { |a,b| a <=> b }
end

我假设使用非破坏性的方法,它可以做我想要的,但我仍然在运行代码时收到错误消息:

  

&#39; my_array_sorting_method! convert会按字母顺序对所有元素进行排序,而不会更改更改的数据&#39;

如果有人可以帮助我,我将非常感激。我是一个Ruby新手,我真的被困在这里。

1 个答案:

答案 0 :(得分:0)

排序

如果您查找ruby文档,您可以找到一些不同的排序方法,供Enumerable个对象(如Array)使用,主要是sort和{{1和他们的变化。

sort_bysort都会返回新的已排序sort_by而不修改原始文件。

<强> Enumerable#sort

传入一个块,告诉它如何比较两个对象。

Array

<强> Enumerable#sort_by

传入一个块,该块检索对象应该被排序的键(使用默认的比较器unsorted = 5.times.map { rand(100) } new_sorted_array = unsorted.sort { |x, y| x <=> y } new_sorted_array = unsorted.sort # this is equivalent because we're only using the default comparator, <=> puts "still unsorted: #{unsorted.inspect}" puts "sorted: #{new_sorted_array.inspect}" ,我认为)

<=>

请注意,此信息全部在线提供,并且我已将上述各部分与其相关的ruby文档相关联。我自己经常提到他们。

按字母顺序比较&#34;

默认情况下,整数与整数和带字符串的字符串相当,使用默认比较器unsorted_wrapped_numbers = 5.times.map { [rand(100)] } new_sorted_array = unsorted_wrapped_numbers.sort_by { |wrapped_number| wrapped_number.first } puts "still unsorted: #{unsorted_arrays_of_single_numbers.inspect}" puts "sorted: #{new_sorted_array.inspect}"

<=>

您需要定义如何将整数与字符串进行比较,但是:

94 <=> 2 # returns 1, meaning "greater than"
3 <=> 3 # returns 0, meaning "equal"
"goodbye" <=> "hello" # returns -1, meaning "less than", since "g" comes before "h", alphabetically

考虑将数字转换为字符串,例如:

5 <=> "word" # returns nil