【问题标题】:Looping through enums? [duplicate]遍历枚举? [复制]
【发布时间】:2015-08-13 01:05:14
【问题描述】:

我正在尝试找到一种更好的方法来编写以下代码:

public static void initTab(Player player) {
    player.getPacketSender().sendString(15002, "Achievements - " + amountCompleted(player, Difficulty.TOTAL) + "/30");
    player.getPacketSender().sendString(15007, "Easy Tasks - " + amountCompleted(player, Difficulty.EASY) + "/10");
    player.getPacketSender().sendString(15008, getColor(player, 0, 0)+Achievements.Tasks.TASK1.getName());
    player.getPacketSender().sendString(15009, getColor(player, 1, 0)+Achievements.Tasks.TASK2.getName());
    player.getPacketSender().sendString(15010, getColor(player, 2, 0)+Achievements.Tasks.TASK3.getName());
    player.getPacketSender().sendString(15011, getColor(player, 3, 0)+Achievements.Tasks.TASK4.getName());
    player.getPacketSender().sendString(15012, getColor(player, 4, 0)+Achievements.Tasks.TASK5.getName());
    player.getPacketSender().sendString(15013, getColor(player, 5, 0)+Achievements.Tasks.TASK6.getName());
    player.getPacketSender().sendString(15014, getColor(player, 6, 0)+Achievements.Tasks.TASK7.getName());
    player.getPacketSender().sendString(15015, getColor(player, 7, 0)+Achievements.Tasks.TASK8.getName());
    player.getPacketSender().sendString(15016, getColor(player, 8, 0)+Achievements.Tasks.TASK9.getName());
    player.getPacketSender().sendString(15017, getColor(player, 9, 0)+Achievements.Tasks.TASK10.getName());
}

我正在考虑使用 for 循环遍历 ID(15008、15009 等...),但我不知道如何以相同的方式遍历枚举值。

我说的是这个: Achievements.Tasks.TASK1.getName()

我有一个名为 Tasks 的枚举,下面是其中一些值的示例:

    TASK1(Difficulty.EASY, TaskType.GLOBAL, "Easy Test1", "Test Description.", 1, new int[]{8147, 8148}),
    TASK2(Difficulty.EASY, TaskType.GLOBAL, "Easy Test2", "Test Description.", 1, new int[]{8150, 8151}),
    TASK3(Difficulty.EASY, TaskType.GLOBAL, "Easy Test3", "Test Description.", 1, new int[]{8153, 8154}),
    TASK4(Difficulty.EASY, TaskType.GLOBAL, "Easy Test4", "Test Description.", 1, new int[]{8156, 8157}),
    TASK5(Difficulty.EASY, TaskType.GLOBAL, "Easy Test5", "Test Description.", 1, new int[]{8159, 8160}),

getName() 获取值中的第一个字符串:“Easy Test1”

我想知道的:一种遍历枚举值的简单方法,因此我只需几行代码就可以对所有值使用 getName() 方法。

总结

我需要遍历这个语句:

player.getPacketSender().sendString(15008, getColor(player, 0, 0)+Achievements.Tasks.TASK1.getName());

我需要知道如何做的是循环:

Achievements.Tasks.TASK#.getName()

这个问题不是重复的,因为我要求遍历两个不同的东西。我需要同时遍历枚举和一个 int(15008、15009 等)。不只是枚举,而不仅仅是 int。我可以将枚举的 for 循环嵌套在 int 的 for 循环中吗?

【问题讨论】:

  • 这似乎是一个常见的用例,枚举类可能有一个返回所有枚举的方法:)
  • 我只需使用 #values() 方法获取所有枚举值,然后遍历该数组。使用您的循环索引(例如“i”)访问当前元素,并通过添加 sth 将其用于其他数字。它并不优雅,但很有效。

标签: java loops enums


【解决方案1】:

Oracle DocumentationAll the constants of an enum type can be obtained by calling the implicit public static T[] values() method of that type. 如果这是你想要的,你可以这样做:

class EnumLoop {
  enum Color {RED, BLUE, GREEN};
  public static void main(String[] args) { 
    for (Color c : Color.values()) {
      System.out.println(c.name());
    }
  }
}

这里是Demo

【讨论】:

  • 我想你可能误解了。我需要重复这一行:player.getPacketSender().sendString(15017, getColor(player, 9, 0)+Achievements.Tasks.TASK10.getName()); 我要问的是如何遍历枚举值,例如:Achievements.Tasks.TASK#.getName())
  • 你是说你的枚举有一个getName() 方法吗?喜欢this
  • get name 方法无关紧要,我只需要知道如何循环遍历值的名称,如 TASK1、TASK2、TASK3。而不是一遍又一遍地调用 getName
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2010-12-12
  • 2011-09-01
  • 1970-01-01
  • 2013-05-16
  • 2014-07-26
  • 2010-11-01
相关资源
最近更新 更多