Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 仅针对特定对象的循环_Ruby_Arrays - Fatal编程技术网

Ruby 仅针对特定对象的循环

Ruby 仅针对特定对象的循环,ruby,arrays,Ruby,Arrays,我正在写一个程序,该程序应该对竞争对手进行排名和排序 # Defining class. Also sorts the array elements in ascending order. class Dancer attr_reader :couplenumber attr_reader :scores def initialize(couplenumber,scores) @couplenumber=couplenumber @scores=scores.sort end end # O

我正在写一个程序,该程序应该对竞争对手进行排名和排序

# Defining class. Also sorts the array elements in ascending order.
class Dancer
attr_reader :couplenumber
attr_reader :scores
def initialize(couplenumber,scores)
@couplenumber=couplenumber
@scores=scores.sort
end 
end

# Opening file, and sorting into array. Also splits with ",".
results = File.open("danceresult.txt", "r+")
dancescores=[]
results.each do |result|
scores = result.split(',').map(&:to_i) 
couplenumber = scores.shift
dancescores << Dancer.new(couplenumber, scores)
end
dancescores.each do |dancers|
  dancers.scores
  # Prints to screen.
  puts "Couple No. #{dancers.couplenumber} got "\
       "a minimum score of #{dancers.scores[3]} or better. "\
       "Their sum is: #{dancers.scores[0..3].inject(:+)}"
end

我想要他们的总和:{dancers.scores[0..3]。inject:+}只接受那些最低分数的人。因此,如果我们有五个竞争者,其中两个最低得分为2,另外三个最低得分为4,那么总和部分应该只考虑最低得分为2的竞争者。是否可以不必重新编写所有代码,如果可以,最简单的方法是什么?

首先确定最低分数:

min_score = dancescores.map{|d| d.scores[3]}.min
然后在打印前添加一个条件:

dancescores.each do |dancer|
  # Prints to screen if the couple has the min_score
  if dancer.scores[3] == min_score
    puts "Couple No. #{dancer.couplenumber} got "\
       "a minimum score of #{dancer.scores[3]} or better. "\
       "Their sum is: #{dancer.scores[0..3].inject(:+)}"
  end
end
或者,您可以使用“选择”仅处理具有min_分数的舞者,如下所示:

dancescores.select{|d| d[3] == min_score}.each do |dancer|
  puts "Couple No. #{dancer.couplenumber} got "\
     "a minimum score of #{dancer.scores[3]} or better. "\
     "Their sum is: #{dancer.scores[0..3].inject(:+)}"
end

您不应该显示所有这些代码。相反,请给出一个数组示例,以及您想要的结果。@sawa:我不同意。上下文可能很重要,而且并不总是先验地清楚它是否会很重要。更好地解释所需的输出会很好,但不要在您尝试过的内容的注释中显示代码结果?正确地说,我试图缩短代码。基本上,它从一个文件中加载一组分数。我想对数组中的第四个元素分数进行比较。也就是说,如果一个数组的第四个位置有一个2,而另一个数组的第四个位置有一个2,那么我希望他们计算和。按照现在的方式,它会计算出他们在第四位的得分是否相同的总和。谢谢,这正是我所想的。但是,当直接解析此代码时,我得到了main:objectnamererror的未定义局部变量或方法“all_dancers”。我是否需要将所有舞者更改为包含所有分数的数组的名称,或者如何更改?当您编辑问题时,您将舞者对象数组中的dancescores替换为仅包含分数数组的arr1。这不再有意义,因为分数既没有编号,也没有与之相关联的分数数组。我是在回答你的直接问题,即如何选择得分最低的舞者。返回到以前创建数组的代码版本。我会改变所有的舞者,以符合你原来的问题。