Ruby中的排序方法

时间:2016-02-14 12:24:30

标签: arrays ruby sorting

我编写了方法,将用户输入(整数)数组从低到高排序并反向排序。代码如下:

 def alphabetize(arr, rev=false)
   arr.sort!
   if rev==true
     arr.reverse!
   end
   return arr 
 end

puts "enter your numbers with 'space' between them"
text = gets.chomp
numbers = text.split(" ")

numbers.each do |element|
  element.to_i
end
puts alphabetize(numbers)

我第一次尝试从0到9的数字,方法工作正常。但后来我尝试输入数字,如1112,11,22,在排序程序后,我得到了这样的结果" 11 1112 22"。在此之后,我尝试以这种方式更改代码:

def alphabetize(arr, rev=false)
  arr.sort!{|a, b| a.to_i <=> b.to_i}
  if rev==true
    arr.reverse!
  end
  return arr 
end

puts "enter your numbers with 'space' between them"
text = gets.chomp
numbers = text.split(" ")
puts alphabetize(numbers)

这样我的代码工作正常,11,1112,22的排序输入产生了我期望的结果:&#34; 11,22,1112&#34;。看起来我已经解决了问题,但我真的想了解第一版和第二版代码之间的区别。为什么方法排序以不同的方式工作?

2 个答案:

答案 0 :(得分:3)

each不会替换数组中的元素 - 它只返回数组本身(不做更改)。

您可能更喜欢使用map

numbers = numbers.map  do |element|
  element.to_i
end

或者,更好的是,使用实际更改数组本身的map!,而不是返回更改后的数组:

numbers.map! do |element|
  element.to_i
end

您还可以使用以下简写:

numbers.map! &:to_i

答案 1 :(得分:0)

首先看起来你仍在比较字符串而不是整数。

事实上,首先你不要将元素转换为整数:

import java.util.*;
import java.lang.*;

class Rextester
{  
    private static final int[] EMPTY = {};
    // Returns int[] if arr[] has a subarray with sero sum
    static int[] findZeroSumSubarray(int arr[])
    {
        if (arr.length == 0) return EMPTY;
        // Creates an empty hashMap hM
        HashMap<Integer, Integer> hM = new HashMap<Integer, Integer>();
        // Initialize sum of elements
        int sum = 0;        
        for (int i = 0; i < arr.length; i++)
        {   
            sum += arr[i]; 
            if (arr[i] == 0)   //Current element is 0
            {
               return new int[]{0}; 
            }
            else if (sum == 0)  // sum of elements from 0 to i is 0
            {
                return Arrays.copyOfRange(arr, 0, i+1);
            }
            else if (hM.get(sum) != null) // sum is already present in hash map
            {
                return Arrays.copyOfRange(arr, hM.get(sum)+1, i+1);
            }
            else
            {
                // Add sum to hash map
                hM.put(sum, i);
            }
        }    
        // We reach here only when there is no subarray with 0 sum
        return null;
    }        

    public static void main(String arg[])
    {
        //int arr[] = {};
        int arr[] = { 2, -3, 1, 4, 6}; //Case left
        //int arr[] = { 0, 2, -3, 1, 4, 6}; //Case 0
        //int arr[] = { 4, 2, -3, 1, 4}; // Case middle
        int result[] = findZeroSumSubarray(arr);
        if (result == EMPTY){
            System.out.println("An empty array is ZeroSum, LOL"); 
        }
        else if ( result != null){
            System.out.println("Found a subarray with 0 sum :" );
            for (int i: result) System.out.println(i);
        }
        else
            System.out.println("No Subarray with 0 sum");            
    }           
}

下面的脚本不会用数组中的整数替换字符串。