我编写了方法,将用户输入(整数)数组从低到高排序并反向排序。代码如下:
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;。看起来我已经解决了问题,但我真的想了解第一版和第二版代码之间的区别。为什么方法排序以不同的方式工作?
答案 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");
}
}
下面的脚本不会用数组中的整数替换字符串。