【问题标题】:Comparing numeric values in ENUM to parameters将 ENUM 中的数值与参数进行比较
【发布时间】:2021-11-12 15:50:25
【问题描述】:

我有以下表示 CardRank 的枚举,按降序排列。

    public enum Position
    {
        ACE('A'), KING('K'), QUEEN('Q'), JACK('J'),
        TEN('T'), NINE('9'), EIGHT('8'), SEVEN('7'),
        SIX('6'), FIVE('5'), FOUR('4'), TREY('3'), DEUCE('2');

        private char symbol;

        private Position(char symbol)
        {
            this.symbol = symbol;
        }

        public char getSymbol()
        {
            return this.symbol;
        }
    }

我需要比较给方法的参数和分配给每个枚举元素的值。当给定的卡片参数具有较低的等级时,该方法应该返回false,并且当给定的参数具有相同或更高的等级时,它应该返回true。

测试让这个问题更清楚。

    @Test
    void testOrder() {
        position = Position.TEN;
        assertFalse(position.isPreceding(Position.ACE));
        assertFalse(position.isPreceding(Position.KING));
        assertFalse(position.isPreceding(Position.QUEEN));
        assertTrue(position.isPreceding(Position.NINE));

        position = Position.TREY;
        assertFalse(position.isPreceding(Position.FOUR));
        assertFalse(position.isPreceding(Position.FIVE));
        assertFalse(position.isPreceding(Position.SIX));
        assertTrue(position.isPreceding(Position.DEUCE));

        position = Position.KING;
        assertTrue(position.isPreceding(Position.QUEEN));
        assertTrue(position.isPreceding(Position.NINE));
        assertTrue(position.isPreceding(Position.DEUCE));
    }

我发现 compareTo()ordinal() 方法似乎是可行的方法,但我无法将 String 参数转换为数字。

这是我最近的尝试:

    public boolean isOrdered (Position position) {
        for (Position p : values()) {
            if (position.compareTo(p) >=0)
                return true;
        }
        return false;
    }

设法解决它。

【问题讨论】:

  • 你是对的,对不起。我调整了这个问题,以便更容易理解/解释,但我忘记了 CardRank(现在保留到位置)。

标签: java enums


【解决方案1】:

使用compareTo() 方法,它是每个enum 的一部分1

public boolean isPreceding(Position position) {
    return this.compareTo(position) < 0;
}

“将字符串参数转换为数字”的含义不是很清楚:,在给定的代码示例中没有使用String。要获得enum给定名称,可以使用其valueOf() 方法2

// this method is not really needed, call `valueOf()` directly
public static Position getForName(String name) {
    // eventually use 'name.toUpperCase()'
    return Position.valueOf(name);
}

现在很容易得到具有枚举名称的序数:

public static int ordinalForName(String name) {
    // use <code>name.toUpperCase()</code> below, if needed 
    return Position.valueOf(name).ordinal();
}

要获得enum 元素,给定它的Symbol,我将使用静态Map 将每个Symbol 映射到它的元素:

private static final Map<Character, Position> positions = Collections.unmodifiableMap(
    Arrays.stream(values()).collect(Collectors.toMap(Position::getSymbol, Function.identity()))
    );
    
public static Position getForSymPosition(char symbol) {
    return positions.get(symbol);
}


这些方法旨在添加到enum 类中。

1 - 查看其超类的文档:Enum
2 - valueOf() 被添加到 JLS 8.9.3 中描述的所有枚举 ass 中

【讨论】:

    【解决方案2】:

    也许添加订单:

    public enum Position
    {
        ACE('A', 14), KING('K', 13), QUEEN('Q', 12), JACK('J', 11),
        TEN('T', 10), NINE('9', 9), EIGHT('8', 8), SEVEN('7', 7),
        SIX('6', 6), FIVE('5', 5), FOUR('4', 4), TREY('3', 3), DEUCE('2', 2);
    
        private char symbol;
        private int order;
    
        private Position(char symbol, int order)
        {
            this.symbol = symbol;
            this.order = order;
        }
    
        public char getSymbol()
        {
            return this.symbol;
        }
    
        public boolean isPreceding (Position position) {
           return this.order < position.order;
        }
    }
    

    【讨论】:

    • 似乎没有通过测试。 (预期:假,实际:真)。此外,UML 没有提到任何关于“订单”的内容。 (但谢谢)
    • UML?这是作业吗?
    • 如果“isPreceding”是指语法在前,您可以更改顺序号以匹配语法顺序。如果“isPreceding”在语义上与套牌游戏一致,那么您的测试用例是错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多