Ruby:使用其中一个的值对2个数组进行排序

时间:2012-04-03 23:17:15

标签: ruby arrays sorting

我正在用ruby创建一个简单的游戏,我有两个存储高分的数组:$HS_Points$HS_Names。我在两个文件中保存了高分,我想稍微编码点(这些点用.to_s(23)转换)。我想按降序对名称和分数进行排序,并将它们限制为10.所以,我需要:

  • 检查玩家得分的数量是否高于高分的数量(在0到9的指数上)。
  • 如果收到的分数足以将玩家设置在前10名,那么将分数和名称放在该地方,将其他地方推到一个地方。

简单points_array.sort不会这样做,因为它只会对点进行排序,将名称按顺序排列。

任何想法如何解决这个问题?我希望尽可能简单地回答。

2 个答案:

答案 0 :(得分:10)

这样的东西?

names = ['Alice', 'Bob', 'Carol']
points = [22, 11, 33]

邮编

您可能需要Array#zip方法:

pairs = names.zip(points)
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]

排序

要按数组字段排序,请比较该对的两个字段。

按名称排序:

pairs.sort{|x,y| x[0] <=> y[0] }  
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]

按分数排序:

pairs.sort{|x,y| x[1] <=> y[1] }  
#=> [["Bob", 11], ["Alice", 22], ["Carol", 33]]

排序依据

排序的另一种方法是使用#sort_by方法而不是比较块(感谢Niklas B。)

按名称排序:

pairs.sort_by(&:first) 
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]

按分数排序:

pairs.sort_by(&:last)
#=> [["Bob", 11], ["Alice", 22], ["Carol", 33]]

选择

只选择高分以上的球员:

pairs.select{|x| x[1] >20 }
#=> [["Alice", 22], ["Carol", 33]]

解压

要解压缩:

pairs.map(&:first)
#=> ["Alice", "Bob", "Carol"]

pairs.map(&:last)
#=> [22, 11, 33]

这些想法可能会指出你正确的方向。

答案 1 :(得分:0)

不要将名称和分数存储在单独的变量中;他们被捆绑在一起,因此他们的数据应该与之相关联。

尝试使用$ HighScores,它是一个哈希数组,其中包含:name元素和:value元素,如:

$HighScores = [  
   { :name => "Bob", :score => 234 },
   { :name => "Mark", :score => 2 },   
]

然后你可以添加一个高分:

$HighScores << { :name => "New Guy", :score => 50000 }

然后对它们进行重新排序,并在一个声明中占据前10名:

$HighScores = $HighScores.sort { |a,b| b[:score] <=> a[:score] }[0,10] 

如果分数是基数为23的编码,这仍然有用。 (但你为什么这样做?)

您可能还应该将它们保存到单个文件中。为了更容易,请考虑使用Marshal模块。

相关问题