如何使用while循环拆分数组?

时间:2013-11-14 19:55:50

标签: ruby

我想编写一个将数组拆分为两个数组的程序,其中一个数组中的任何元素都小于另一个数组中的任何元素。

我的输入是:

a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]

我想要像这样的输出:

[6, 23, 17, 18 , 9] < [45, 65, 48, 97, 32, 88]

我试过了:

i = 0
max = 0

while i < a.size
  if a[i] > max
    max = a[i]
  end
  i+=1
end

puts "this is the larger array: " + max.to_s

哪个完全没了。由于我是新手,所以我们非常感谢您的帮助。

5 个答案:

答案 0 :(得分:4)

small, large = a.sort!.shift(a.size/2) ,a

p small, large 
#=> [6, 9, 17, 18, 23]
#=> [32, 45, 48, 65, 88, 97]

答案 1 :(得分:2)

试试这个:

newarray = a.sort.each_slice((a.size/2.0).round).to_a

它将为您提供一个包含split数组的数组:

newarray = [[6,9,17,18,23,32],[45,48,65,88,97]]

在这种情况下,如果数组中有奇数个元素,则返回的第一个数组将始终具有额外元素。如果您愿意,也可以单独保存数组,但这样您可以使用newarray [0]和newarray [1]调用每一半。如果你想拆分它们,只需添加:

b = newarray[0]
c = newarray[1]

答案 2 :(得分:0)

不要使用while循环 - 对数组进行排序,然后将其拆分为两个

a.sort
a.in_groups_of( a.size/2)


a.sort.each_slice( a.size/2) probably does the trick without rails.

答案 3 :(得分:0)

假设您要保留订单,例如:

def split_it(a,n)
  f = a.select {|e| e <= n}
  [f, a-f]
end

a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]

f, l = split_it(a,23)
puts "#{f} < #{l}" # => [6, 23, 17, 18, 9] < [45, 65, 48, 97, 32, 88]

如果您想保留订单并让第一个子数组包含nbr元素,请添加以下内容:

def split_nbr(a, nbr)
  n = 1
  loop do
    return [] if n > a.max
    b = split_it(a,n)
    return b if b.first.size == nbr
    n += 1
  end   
end

f, l = split_nbr(a,3)
puts "#{f} < #{l}" # => [6, 17, 9] < [45, 23, 65, 48, 97, 32, 18, 88]

答案 4 :(得分:0)

a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]
a = a.sort
print a.shift(a.count/2), " < " , a 
#=> [6, 9, 17, 18, 23] < [32, 45, 48, 65, 88, 97]

另一种变化

a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]
a = a.sort
print a.values_at(0..a.count/2), " < ", a.values_at((a.count/2)+1 .. -1)
#=> [6, 9, 17, 18, 23] < [32, 45, 48, 65, 88, 97]