假设我有 4 个字符,A、P、B、N。我希望能够比较它们:
A > P > B > N > A
这将如何在 Ruby 中完成?
从您的评论来看,您似乎不是试图将这些元素按顺序排列,而是在其中一些元素之间定义一些二元关系。在 Ruby 中可以通过多种方式做到这一点,这取决于您以后打算如何使用该关系。
最简单的就是定义相关元素的有序对:
MAP = [
['A', 'P'],
['P', 'B'],
['B', 'N'],
['N', 'A']
]
然后在需要“比较”两个元素时使用它。
def beats? one, other
MAP.member?([one, other])
end
beats? 'A', 'B'
# => false
beats? 'A', 'P'
# => true
beats? 'N', 'A'
# => true
PS。您可以使用类似的东西从字符串生成地图
MAP = 'APBNA'.chars.each_cons(2).to_a
一种可能的解决方案是创建一个类,例如,character
andweight
或 something。并在其中实现<=>
运算符(方法)。
不要忘记在Comparable
这个类中包含 mixin。
class ComparableCharacter
include Comparable
attr_accessor :character, :weight
def <=>(another)
weight <=> another.weight
end
end
a = "APBN"
h = {};(0...a.size).each{|i| h[a[i].chr] = i}
b = ['A','P','A','N', 'B','P']
b.sort_by{|t| h[t] }
当然,这不适用于您的示例,因为您的排序错误 - 您永远不会有 A > P > A,但至少它向您展示了如何根据您想要的顺序进行排序。
如果有人感兴趣,这是我的建议(三元比较——因为比较不是二元运算!!!):
class RockPaperScissors
ITEMS = %W(A P B N)
def self.compare(item, other_item)
new(item).compare other_item
end
def initialize(item)
# input validations?
@item = item
end
def compare(other_item)
# input validations?
indexes_subtraction = ITEMS.index(@item) - ITEMS.index(other_item)
case indexes_subtraction
when 1, -1
- indexes_subtraction
else
indexes_subtraction <=> 0
end
end
end
require 'test/unit'
include MiniTest::Assertions
assert_equal RockPaperScissors.compare('A', 'A'), 0
assert_equal RockPaperScissors.compare('P', 'P'), 0
assert_equal RockPaperScissors.compare('B', 'B'), 0
assert_equal RockPaperScissors.compare('N', 'N'), 0
assert_equal RockPaperScissors.compare('A', 'P'), 1
assert_equal RockPaperScissors.compare('P', 'A'), -1
assert_equal RockPaperScissors.compare('P', 'B'), 1
assert_equal RockPaperScissors.compare('B', 'P'), -1
assert_equal RockPaperScissors.compare('B', 'N'), 1
assert_equal RockPaperScissors.compare('N', 'B'), -1
assert_equal RockPaperScissors.compare('N', 'A'), 1
assert_equal RockPaperScissors.compare('A', 'N'), -1
平等:(A,A)比较
多数:(A,P)
-
函数:- (-1) -> 1
少数:(P,A)
-
函数:- (1) -> -1
边缘情况 1:(N,A)
<=>
函数:(3 <=> 0) -> 1
边缘情况 2:(A,N)
<=>
函数:(3 <=> 0) -> 1
剩下的就是重构:0
可以0
用<=>
函数转换成。