1

这是家庭作业,所以我不想放我的代码。我有 2 个并行数组,1.names 2.ages。这个想法是把所有年龄都放在 21 岁以下。我可以做到这一点。问题是当我放 "#{count}. #{names[count]}, #{ages[count]}" <---开始计数打印出数组中元素的索引号或位置。显然我想要的是它从 1 开始。如果有三个名字......

  1. 姓名年龄
  2. 姓名年龄
  3. 姓名年龄

不是

5、姓名、年龄

6、姓名、年龄

我正在使用带有 if 语句的 while 循环。我不需要代码,只是想要一些反馈来触发更多想法。感谢您的时间,非常感谢。

names[name1, name2, name3]
ages[age1, age2, age3]

#view all younger than 21
    count = 0
    while count < names.length
      if ages[count] < 21
        puts "#{count}. #{names[count]}, #{ages[count]}" #works
      end
      count += 1
    end
    pause
4

1 回答 1

2

首先,您不应该有“并行数组”!属于一起的数据应该一起处理,而不是分开处理。

而不是像

names = %w[john bob alice liz]
ages  =   [16,  22, 18,   23 ]

例如,您可以有一个地图(Hash在 Ruby 中调用):

people = { 'john' => 16, 'bob' => 22, 'alice' => 18, 'liz' => 23 }

然后你会有类似的东西:

puts people.select {|_name, age| age > 21 }.map.
  with_index(1) {|(name, age), i| "#{i}. #{name}, #{age}" }
# 1. bob, 22
# 2. liz, 23

如果您无法控制这些并行数组的创建,那么最好先将它们转换为合理的数据结构,并避免在算法中处理它们的痛苦:

people = Hash[names.zip(ages)]

更好的是:你应该有Person对象。毕竟,Ruby 是面向对象的,而不是面向数组或面向哈希的:

class Person < Struct.new(:name, :age)
  def to_s
    "#{name}, #{age}"
  end

  def adult?
    age > 21
  end
end

people = [
  Person.new('john',  16), 
  Person.new('bob',   22), 
  Person.new('alice', 18), 
  Person.new('liz',   23)]

puts people.select(&:adult?).map.with_index(1) {|p, i| "#{i}. #{p}" }

同样,如果您无法控制这两个并行数组的创建,您仍然可以转换它们:

people = names.zip(ages).map {|name, age| Person.new(name, age) }
于 2013-11-07T12:23:42.453 回答