我有一个问题..附加

时间:2015-12-30 15:54:11

标签: ruby numbers append

我有这段代码:

  1 #!/local/usr/bin/ruby
  2 
  3 users = (1..255).to_a
  4 
  5 x = " "
  6 y = " "
  7 z = " "
  8 #a = " "
  9 
 10 count = 1
 11 users.each do |i|
 12   x << i if count == 1
 13   y << i if count == 2
 14   z << i if count == 3
 15  # if x.length == 60
 16  #   a << i if count == 1
 17  #   a << i if count == 2
 18  #   a << i if count == 3
 19  # else
 20  # end
 21   if count == 3
 22     count = 1
 23   else
 24     count += 1
 25   end
 26 end
 27 
 28 puts x.length
 29 puts y.length
 30 puts z.length
 31 #puts a.length
 32 

这段代码的作用是将数字1-255附加到三个不同的字符串中,并输出每个字符串中有多少个数字。

IT工作

工作代码示例:

[user@server ruby]$ ruby loadtest.rb
86
86
86
[user@server ruby]$ 

现在我想要它做的是有一个名为a的故障安全,如上所示,注释掉了,我想要的是,如果每个字符串包含60个数字,我希望它附加到{{1} }字符串,直到没有更多数字。

当我尝试使用注释掉的部分时,它会输出:

a

WHY?我做错了什么?

3 个答案:

答案 0 :(得分:2)

  

这段代码的作用是将数字1-255附加到三个不同的字符串中,并输出每个字符串中有多少个数字。

在减少为了便于阅读而迭代的值的数量之后,这是它正在做的事情:

users = (1..5).to_a

x = " "
y = " "
z = " "

count = 1
users.each do |i|
  x << i if count == 1 # => " \u0001", nil, nil, " \u0001\u0004", nil
  y << i if count == 2 # => nil, " \u0002", nil, nil, " \u0002\u0005"
  z << i if count == 3 # => nil, nil, " \u0003", nil, nil

  if count == 3
    count = 1
  else
    count += 1
  end
end

x # => " \u0001\u0004"
y # => " \u0002\u0005"
z # => " \u0003"

puts x.length
puts y.length
puts z.length

# >> 3
# >> 3
# >> 2

你的代码是在字符串中创建二进制文件,而不是&#34;数字&#34;正如我们通常认为的那样,数字。

继续,您可以使用each_with_indexcase / when来清理逻辑。为了使结果更具可读性,我从累积到字符串切换到数组:

users = (1..5).to_a

x = []
y = []
z = []

users.each_with_index do |i, count|
  case count % 3
  when 0
    x << i
  when 1
    y << i
  when 2
    z << i
  end
end

x # => [1, 4]
y # => [2, 5]
z # => [3]

puts x.length
puts y.length
puts z.length

# >> 2
# >> 2
# >> 1

真正的诀窍是使用%,它对值进行模数计算。

答案 1 :(得分:1)

  

...如果每个字符串包含60个数字,我希望它附加到字符串中,直到没有更多的数字

如上所述,即使达到极限,您也无条件地追加x,y,z。 您需要在此代码周围添加条件:

$_POST['name'][0]

一旦达到你的限制就停止追加。

看起来没有做任何事情的其他区块,我认为你是朝这个方向前进的:

   x << i if count == 1
   y << i if count == 2
   z << i if count == 3

但即便如此,也不会完全符合您的要求。 您需要检查要附加的字符串,看它是否已达到您的限制。

我建议重构以使其更清洁:

  if x.length == 60
    a << i if count == 1
    a << i if count == 2
    a << i if count == 3
  else
   x << i if count == 1
   y << i if count == 2
   z << i if count == 3
  end

答案 2 :(得分:1)

在将数字推入这些变量时,最好使用数组而不是字符串。

让我提出一个解决方案,它或多或少地实现了你想要做的事情,但是使用了一些可能在将来有用的Ruby技巧。

x, y, z = r = Array.new(3) {[]}
a = []

iter = [0,1,2].cycle

(1..255).each do |i|
  r.all? {|i| i.size == 60} ? a << i : r[iter.next] << i
end

p x.size, y.size, z.size
p a.size

让我们定义我们的数组。即使我有数组xyz,它们只是因为它们存在于您的代码中 - 我认为我们只需要三个数组,每个数组都会收集数字因为它们是从一系列数字中挑选出来的 - 一个接一个地在1到255之间。 x,y,z = r使用并行分配技术,相当于x,y,z = r[0],r[1],r[2]。此外,使用Array.new(3) {[]}有助于创建数组Array,以便在我们访问r[1]时默认使用空数组[]初始化它。

x, y, z = r = Array.new(3) {[]}
a = []

为了确定哪个数组必须放入从范围中选取的下一个数字,我们将使用从Enumerable#cycle生成的枚举器。这个枚举器是特殊的 - 因为它本质上是无限的 - 我们可以通过调用next继续要求它给出一个元素,它将循环遍历[0,1,2]的数组元素 - 返回我们{ {1}}无限。

0,1,2,0,1,2,0,1,2...

接下来,我们将遍历数字范围1..255。在每次迭代期间,我们将在Enumerable#all?的帮助下检查我们正在收集数字的所有3个数组是否具有所需的iter = [0,1,2].cycle 大小 - 如果是这样,我们会将数字附加到数组{{1 - 否则我们将根据60枚举器返回的数组索引将其分配给a的一个子数组。

r

最后,我们打印每个数组的大小。

iter