[Ruby] 構造体をソートする

部活で必要なものをちょこちょこ書いている時必要になったのでメモ。

Item = Struct.new(:x, :y, :z)
data = []

data << Item.new(1, 30, 200)
data << Item.new(5, 10, 400)
data << Item.new(3, 40, 500)
data << Item.new(2, 50, 100)
data << Item.new(4, 20, 300)

x = data.sort do |i, j|
  i.x <=> j.x
end
y = data.sort do |i, j|
  i.y <=> j.y
end
z = data.sort do |i, j|
  i.z <=> j.z
end

x.each do |n|
  print n.x, "\t", n.y, "\t", n.z, "\n"
end
puts
y.each do |n|
  print n.x, "\t", n.y, "\t", n.z, "\n"
end
puts
z.each do |n|
  print n.x, "\t", n.y, "\t", n.z, "\n"
end

実行結果

1 30 500
2 50 100
3 40 500
4 20 300
5 10 400

5 10 400
4 20 300
1 30 500
3 40 500
2 50 100

2 50 100
4 20 300
5 10 400
3 40 500
1 30 500

上から xでソートした場合 yでソートした場合 zでソートした場合。 ソートの順序(昇順/降順)を変更するには、比較の箇所を変更すればOK.


comments powered by Disqus