有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在枚举中查找最高值

我正在为我正在制作的游戏制作一个类,但我不知道如何向用户返回最高的“奖励”:

我想让它做的是根据玩家的杀戮回报奖励。如果他有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());
        }
    }
}

}


共 (1) 个答案

  1. # 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枚举,但其KillsNeed值较低,那么它将不会返回正确的值

    更好的解决方案是创建一个比较器,并使用它按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));
        }
    
    }