创建任意的字符层次结构



假设我有4个字符,A、p、B、N。我希望能够比较它们,以便:

A>p>B>N>

在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

一种可能的解决方案是创建一个类,例如characterweight之类的。并在其中实现了<=>算子(方法)

不要忘记将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)比较

  1. 索引:iA:0;iA:0
  2. iA-iA=0
  3. A等于A,所以我们可以返回0

多数:(A,p)

  1. 索引:iA:0;iP:1
  2. iA-iP=-1
  3. A>P,所以我们必须得到1;我们可以使用-函数:- (-1) -> 1

少数:(p,A)

  1. 索引:iP:1;iA:0
  2. iP-iA=1
  3. P<A、 所以我们必须得到-1;我们可以使用-函数:- (1) -> -1

边缘情况1:(N,A)

  1. 索引:iN:3,iA:0
  2. iN-iA=3
  3. N>A,所以我们必须得到1;我们可以使用<=>函数:(3 <=> 0) -> 1

边缘情况2:(A,N)

  1. 索引:iA:0,iN:3
  2. iA-iN=-3
  3. A<N、 所以我们必须得到-1;我们可以使用<=>函数:(3 <=> 0) -> 1

剩下的就是重构:0可以通过<=>函数转换为0

相关内容

  • 没有找到相关文章

最新更新