Ruby-对数组值进行排序,然后选择新数组

Ruby-对数组值进行排序,然后选择新数组,ruby,arrays,sorting,Ruby,Arrays,Sorting,我在按升序排序数组时遇到问题,然后从数组中选取一个值放入新数组 # Splitting dance scores with "," and putting into arrays. for dancers in results a = dancers.split(",") couplenumber = a[0] score1 = a[1] score2 = a[2] score3 = a[3] score4 = a[4] score5 = a[5] score6

我在按升序排序数组时遇到问题,然后从数组中选取一个值放入新数组

# Splitting dance scores with "," and putting into arrays.
for dancers in results
  a = dancers.split(",")

  couplenumber = a[0]
  score1 = a[1]
  score2 = a[2]
  score3 = a[3]
  score4 = a[4]
  score5 = a[5]
  score6 = a[6]
  score7 = a[7]
  dancescores << Dancer.new(couplenumber, score1, score2, score3, score4, score5, score6, score7)
  # Sorts the array into ascending order, and shows the 4 lowest values.
  #p dancescores.sort.take(4)

  # Getting the m value, from picking the 4th lowest number.
  m = a[4]
  newtest = [couplenumber, m]
  coupleandscore << newtest
  coupleandscore
end
puts coupleandscore
我将得到以下错误:

[#<Dancer:0x10604a388 @score7=5, @score3=3, @score6=6, @score2=2, @score5=1, @score1=1,     @couplenumber="34", @score4=3>]
examtest.rb:43:in `sort': undefined method `<=>' for #<Dancer:0x10604a388> (NoMethodError)
[#]
rb:43:in'sort:#(NoMethodError)的未定义方法`'

任何形式的帮助都将不胜感激

您可以像这样在Dancer上实现

class Dancer
  def sum_scores
    @score1 + @score2 + @score3 + @score4 + @score5 + @score6 + @score7
  end
  def <=> other_dancer
    sum_scores <=> other_dancer.sum_scores
  end
end
班级舞蹈演员
def sum_分数
@分数1+@score2+@score3+@score4+@score5+@score6+@score7
结束
其他舞者
和其他舞者一起得分
结束
结束
我假设分数加起来就是一个总数

更新:评分基于排序分数中的第四个值

class Dancer
  def scores
    [@score1,@score2,@score3,@score4,@score5,@score6,@score7]
  end
  def <=> other_dancer
   scores.sort[3] <=> other_dancer.scores.sort[3]
  end
end
班级舞蹈演员
def分数
[@score1、@score2、@score3、@score4、@score5、@score6、@score7]
结束
其他舞者
得分。排序[3]其他舞者。得分。排序[3]
结束
结束
现在在代码中执行以下操作:

for dancers in results
  a = dancers.split(",")

  couplenumber = a[0]
  score1 = a[1]
  score2 = a[2]
  score3 = a[3]
  score4 = a[4]
  score5 = a[5]
  score6 = a[6]
  score7 = a[7]
  dancescores << Dancer.new(couplenumber, score1, score2, score3, score4, score5, score6, score7)
end
puts dancescores.sort.map{|d| [d.couplenumber,d.scores.sort[3]]}
用于结果中的舞者
a=舞者。分开(“,”)
编号=a[0]
分数1=a[1]
分数2=a[2]
得分3=a[3]
分数4=a[4]
得分5=a[5]
得分6=a[6]
得分7=a[7]

dancescores你应该更准确地解释你想做什么

据我所知:

class Dancer

  attr_reader :number
  attr_reader :scores

  def initialize(number,scores)
    @number=number
    @scores=scores.sort
  end  
end

dancescores=[]

results.each do |result|
  scores = result.split(',')
  couplenumber = scores.shift
  dancescores << Dancer.new(couplenumber, scores)
end

# Now you can get the 4th score for each couple
dancescores.each do |dancers|
  p dancers.scores[3]
end
班级舞蹈演员
属性读取器:编号
属性读取器:分数
def初始化(数字、分数)
@数字=数字
@分数=分数。排序
结束
结束
dancescores=[]
结果。每个都有结果|
分数=结果。拆分(',')
couplenumber=scores.shift

dancescores实际上我需要比较我从每个舞者那里得到的值。它必须是最低的第四个,这就是为什么我试图将它按升序排序,然后选择第四个值。那么你是指四个最低的分数还是四个最低的舞者?每个舞者将得到7分。假设一个舞者得到(1,3,6,1,5,5,3),我想对它进行排序,所以改为(1,1,3,3,5,5,6),然后选择第四个值,在本例中是数字3。或者有更简单的方法吗?当我尝试时,我得到了这样的错误:
25:in
”:未定义的方法
,用于考试中的nil:NilClass(NoMethodError)。rb:50:in
排序“使用@Yoann Le Touche的答案更好你的得分并不完全清楚;你能解释清楚吗?
错误是因为您尚未定义
方法。请参阅模块和的文档。基本上,每对夫妇的分数都在1-6之间,1是最好的。他们得到了7名评委的评分。他们可能会得到这样的分数(1,4,2,6,6,5,3)。所以我想对它进行排序,这样我就按照这样的升序(1,2,3,4,5,6,6),然后选择第四个值(在本例中是数字4)并对每个舞者进行比较(以找到获胜者,这是第四个数字中值最低的一个)。我从加载的文件中获取结果,我将其命名为
results=file.open(“dancersult.txt”,“r+”
所以当我运行代码时,我得到了一个错误:
aa.rb:17:未定义的方法“scores”for#(NoMethodError)from aa.rb:16:in
each'`我忘了添加属性读取器来访问Dancer类中的数字和分数。现在应该没事了。你仍然需要用chomp和strip清理你的输入,以摆脱EOF和leading spaceBonus问题,如果我需要一种方法来获取夫妇数量,并显示他们的分数,你会怎么做?在dancescores循环中:放置“#{dancers.number}=>#{dancers.scores[3]}”啊,当然!如果我想在0..3数组中添加数字并显示它们,最简单的方法是什么?我曾尝试在循环中+它们,但它不起作用,因为它只显示每个数组的内容,而不是加总的内容。
class Dancer

  attr_reader :number
  attr_reader :scores

  def initialize(number,scores)
    @number=number
    @scores=scores.sort
  end  
end

dancescores=[]

results.each do |result|
  scores = result.split(',')
  couplenumber = scores.shift
  dancescores << Dancer.new(couplenumber, scores)
end

# Now you can get the 4th score for each couple
dancescores.each do |dancers|
  p dancers.scores[3]
end