【问题标题】:Find Highest Value in Enum在枚举中查找最大值
【发布时间】:2013-03-23 02:16:39
【问题描述】:

我正在为我正在制作的游戏制作课程,但不知道如何将最高“奖励”返还给用户:

我想让它做的是根据玩家的击杀数返还奖励。如果他有 38 次击杀,它应该只返回 300。而不是 150。

    class EnumTest {

private static int playerKills = 38;

private enum KillReward {

    BEGINNER(10, 150),
    JUNIOR(25, 300),
    EXPERT(50, 500),
    CHAMPION(100, 1000);

    private KillReward(int kills, int reward) {
        this.kills = kills;
        this.reward = reward;
    }

    private int kills, reward;

    private int getKillsNeeded() {
        return kills;
    }

    private int getKillReward() {
        return reward;
    }
}

public static void main (String[] args) {
    for (KillReward k : KillReward.values()) {
        if (playerKills > k.getKillsNeeded()) {
            System.out.println("Kills: " + playerKills + "; Reward: " + k.getKillReward());
        }
    }
}

}

【问题讨论】:

    标签: java arrays enums java-7 enumeration


    【解决方案1】:

    有几种方法可以做到这一点。

    一种简单的方法是将奖励分配给一个变量。在该循环结束时,下面的reward 变量将是适用的最高击杀奖励

    public static void main (String[] args) {
        KillReward reward = null;
        for (KillReward k : KillReward.values()) {
            if (playerKills > k.getKillsNeeded()) {
                reward = k;
            }
        }
        System.out.println("Kills: " + playerKills + "; Reward: " + k.getKillReward());
    }
    

    请注意,这依赖于按顺序列出的枚举,有时可能很脆弱。例如,如果在 CHAMPION 之后添加了一个新的 KillReward 枚举,但它的 killsNeeded 值较低,则它不会返回正确的值。

    更好的解决方案是创建一个 Comparator 并使用它首先按 killsNeeded 对枚举值进行排序,从而确保它们始终按顺序排列。如果您还按降序对其进行排序,那么您也可以在点击第一个适用的循环后中断循环。

    class EnumTest {
    
        private enum KillReward {
    
            BEGINNER(10, 150), JUNIOR(25, 300), EXPERT(50, 500), CHAMPION(100, 1000);
    
            // Sort KillRewards once at initialization
            private static final List<KillReward> sortedKillRewards = new ArrayList<KillReward>();
            static {
                for (KillReward k : values())
                    sortedKillRewards.add(k);
                Collections.sort(sortedKillRewards, new Comparator<KillReward>() {
                    @Override
                    public int compare(KillReward o1, KillReward o2) {
                        return (o1.kills - o2.kills) * -1; // multiplying by -1 makes it
                        // descending
                    }
                });
            }
    
            private KillReward(int kills, int reward) {
                this.kills = kills;
                this.reward = reward;
            }
    
            private int kills, reward;
    
            private int getKillsNeeded() {
                return kills;
            }
    
            private int getKillReward() {
                return reward;
            }
    
            public static KillReward forKills(int killCount) {
                for (KillReward k : sortedKillRewards)
                    if (killCount >= k.kills)
                        return k;
    
                // must not have enough kills for any reward
                return null;
            }
        }
    
        public static void main(String[] args) {
            int kills = 9;
            System.out.println("Kills: " + kills + "; Reward: "
                    + KillReward.forKills(kills));
    
            kills = 10;
            System.out.println("Kills: " + kills + "; Reward: "
                    + KillReward.forKills(kills));
    
            kills = 38;
            System.out.println("Kills: " + kills + "; Reward: "
                    + KillReward.forKills(kills));
        }
    
    }
    

    【讨论】:

    • 感谢您的回复!我从来没有使用过比较器。你介意给我一些关于使用比较器来做这件事的见解吗?
    • 我使用上面的比较器添加了一个版本。
    • 漂亮...非常感谢。
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2010-09-14
    • 2010-09-17
    • 2019-07-21
    • 1970-01-01
    • 2011-05-18
    • 2014-05-24
    相关资源
    最近更新 更多