-4

这可能是超级基本的,但我已经尝试了足够多的东西但未能达到..

我想将一个数字更改为负数。

answer = []
array = [3, 5, 2, 19, 2, 1]

array.each.with_index do |x, i|

   if x > array[i+1]
      answer << array[i] * -1
   else x =< array[i+1]
      answer << array[i] 
   end
 end
=> the answer I want is [-5] for when 'true' but I'm getting [5]

我还尝试使用所有等效的负数作为“数组”制作一个新的“negarray”

answer = []
array = [3, 5, 2, 19, 2, 1]
negarray = [-3, -5, -2, -19, -2, -1]

=> again, getting [5], and not the [-5] I want. 

干杯!

4

3 回答 3

4

在实际版本中,问题不清楚。

如果你的意思是

我想将一个数字更改为负数。

你总是想要一个负数,那么你可以尝试:

answer = []
array = [3, 5, 6, 19, 2, 1]

array.each do |x|
   if x > 0
      answer << x * -1
   else
      answer << x 
   end
 end

 p answer

或者

array.each do |x|
   answer << if x > 0
       x * -1
   else
       x 
   end
 end

或使用三元运算符:

array.each do |x|
   answer << (x > 0 ? -x : x)
 end

或者更短、更多的 ruby​​-esk(使用三元运算符):

 array = [3, 5, 6, 19, 2, -1]
 answer = array.map { |n| n > 0 ? -n : n }

如果您喜欢更长的时间,如果:

 answer = array.map do |n| 
  if n > 0 
    -n 
  else
    n 
  end
 end

如果您不想使用任何 if 结构,那么您可以使用否定的 abs 方法:

 answer = array.map { |n| -n.abs }
于 2016-01-09T00:15:09.167 回答
4

与以下行

if x > array[i+1]

您基本上是在说如果位置处的元素i大于位置处的元素,i+1则要将其设为负数。问题是它5比下一个元素小6,因此它没有被否定。

让我们修复您的代码,并使用该map方法来简化它:

out = array.map.with_index do |x, i|
   (array[i+1].nil? || x > array[i+1]) ? x : x*-1
end
# [-3, -5, -6, 19, 2, 1]
于 2016-01-09T00:36:43.573 回答
-1

如果要获取索引 1 处第二个数组元素的负值,请执行以下操作

answer << array[1] * -1

要将数组的所有值更改为负数,请使用以下命令

answer = array.map { |n| -n }
于 2016-01-09T00:02:04.053 回答