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

ekh*_*oll 1 ruby arrays sorting

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

  • 检查玩家得分的数量是否高于高分的数量(在索引0到9).
  • 如果收到的分数足以将玩家设置在前10名,则将分数和名称放在该位置,将其他位置向下推一个位置.

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

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

joe*_*son 10

像这样的东西?

names = ['Alice', 'Bob', 'Carol']
points = [22, 11, 33]
Run Code Online (Sandbox Code Playgroud)

压缩

您可能需要Array#zip方法:

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

分类

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

按名称分类:

pairs.sort{|x,y| x[0] <=> y[0] }  
#=> [["Alice", 22], ["Bob", 11], ["Carol", 33]]
Run Code Online (Sandbox Code Playgroud)

按分数排序:

pairs.sort{|x,y| x[1] <=> y[1] }  
#=> [["Bob", 11], ["Alice", 22], ["Carol", 33]]
Run Code Online (Sandbox Code Playgroud)

排序方式

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

按名称分类:

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

按分数排序:

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

选择

要仅选择高分以上的球员:

pairs.select{|x| x[1] >20 }
#=> [["Alice", 22], ["Carol", 33]]
Run Code Online (Sandbox Code Playgroud)

拉开拉链

解压缩:

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

pairs.map(&:last)
#=> [22, 11, 33]
Run Code Online (Sandbox Code Playgroud)

这些想法可能会指向正确的方向.