Java 存储枚举与结果的组合

Tim*_*imo 5 java enums combinations

我有一个非常棘手的问题,目前无法找到答案:

我拥有的是一个带有 x 变体的枚举,例如:

public enum Symbol {
    ROCK,
    PAPER,
    SCISSORS;
}
Run Code Online (Sandbox Code Playgroud)

这个枚举应该扩展一个、两个……变体(如石头、布、剪刀、史波克、蜥蜴),我正在寻找一个选项来存储组合的结果(在示例中,谁获胜)。就像在《石头、剪刀、布》中一样,我无法为枚举分配权重/值,然后可以将其用于比较。比较的结果不是基于逻辑的。我目前正在做的是:

public Result calculateResult(Symbol hand2) {

            Symbol handP1 = this;
            Symbol handP2 = hand2;

            if (handP1 == Symbol.ROCK) {
                switch (handP2) {
                    case SCISSORS:
                        return Result.WIN;
                    case ROCK:
                        return Result.TIE;
                    case PAPER:
                        return Result.LOOSE;
                } ....
Run Code Online (Sandbox Code Playgroud)

我对比较的第一个元素的每个可能选项都执行此操作(在示例 hand1 中)。对于 3 个枚举,这非常简单和整洁,但是对于 4,5 个或更多,它很快就会变得混乱。使用 if 和 else if 进行比较也不太合适。有没有更好的方法来处理这个问题?

如果你想自己尝试一下,我已经设置了一个 repl:REPL 链接

使用 for 或更多选择打破了 3 个选择可能存在的循环关系。请参阅此处的示例:

5 个选择

感谢您提供任何可能帮助我获得更好解决方案的提示和提示

Ank*_*ush 4

像这样的东西可以帮助

public enum Symbol {
    ROCK,
    SCISSORS,
    PAPER;

  private List<Symbol> beats;

  static {
    ROCK.beats = Arrays.asList(SCISSORS);
    SCISSORS.beats = Arrays.asList(PAPER);
    PAPER.beats = Arrays.asList(ROCK);
  }
    
    public Result calculateResult(Symbol hand2) {

        if (this.beats.contains(hand2)) return Result.WIN;
        if (hand2.beats.contains(this)) return Result.LOOSE;
        return Result.TIE;
    }
}
Run Code Online (Sandbox Code Playgroud)