【问题标题】:How to get an Enum value from a Multimap如何从 Multimap 中获取枚举值
【发布时间】:2016-01-31 12:04:15
【问题描述】:

这是我的enum

public enum StaffRanks {

    HELPER("helpers"),
    MODERATOR("moderators"),
    ADMINISTRATOR("administrators"),
    DEVELOPER("developers"),
    OWNER("owners");

    private String name;

    StaffRanks(String name) {
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

这就是我创建Multimap 的方式:

public static Multimap<String, StaffRanks> staffMembers;

public static void fetchPlayerRanks() {
    JsonParser parser = new JsonParser();

    try {
        Object obj = parser.parse(new FileReader(".\\Data\\staff_list.json"));
        JsonObject staffList = (JsonObject) obj;

        Type listType = new TypeToken<List<String>>() {
        }.getType();

        staffMembers = ArrayListMultimap.create();

        for (StaffRanks rank : StaffRanks.values()) {
            staffMembers.put(new Gson().fromJson(staffList.get(rank.getName()), listType), rank);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这就是我想使用它的方式:

int index = 39550;

for (String player : allStaffNames) {

    onlineStatus = "@red@Offline";

    if (onlineStaff.contains(PlayerHandler.getPlayer(player))) {
        onlineStatus = "@gre@Online";
    }

    if (staffMembers.containsKey(player)) {
        playerClient.getPA().sendFrame126("[" + staffMembers.get(player).getName() + "]@cya@" + Misc.formatPlayerName(player) + ": ", index);
    }

    playerClient.getPA().sendFrame126(onlineStatus, index - 1);

    index += 2;
}

现在,问题是:如何从Multimap 中的枚举中获取名称?

这是我尝试过的。但是,它没有用。

staffMembers.get(player).getName()

Staff_list.json 文件如下所示:

{
    "owners":['chuck'],
    "developers":['tyrant','stan'],
    "serverManagers":['logical'],
    "staffManagers":['bench press', 'bench press2'],
    "communityManagers":['cleave'],
    "administrators":['zeven', 'reavers', 'redaeran', 'stuart'],
    "moderators":['searwen', 'potentials', 'maud', 'lickylicky'],
    "helpers":['megafun12', 'rhysj', 'vaping', 'punch']
}

【问题讨论】:

  • staff_list.json 条目的外观如何? player 字符串文字是什么样的?这应该是诀窍......
  • @tmarwen 添加了 json 文件,谢谢 :)
  • 您能否进一步说明您的示例中哪些部分不起作用?抛出的错误是什么以及在哪一部分?我几乎看不到它甚至可以编译。

标签: java json enums guava multimap


【解决方案1】:

因为staffMembers 被定义为Multimap&lt;String, StaffRanks&gt;,这意味着您应该将其读作Map&lt;String, Collection&lt;StaffRanks&gt;&gt;,在这种情况下使用闪亮的Guava 接口(即将键映射到值的集合)。所以在你的情况下,你实际上想要做的是:

Collection<StaffRanks> staffRanksForPlayer = staffMembers.get(player);
staffRanksForPlayer.getName(); // BOOM!

如果您阅读/附加了错误消息,会容易得多。无论如何,你有两个选择:

  1. 您使用了错误的收藏类型,因为您想要 Map&lt;String, StaffRank&gt;,如果一名玩家只能拥有一个等级 - 如果是这样,请将收藏更改为 Map,这样就可以了。
  2. 您必须以某种方式找到匹配的排名,或者在您的代码中使用所有这些排名。例如,后者可以用 Java 8 实现:

    List<String> staffRanksNamesForPlayer = staffMembers.get(player).stream()
        .map(StaffRanks::getName)
        .collect(Collectors.toList());
    
    // use list's `toString()` in your code to print its contents
    playerClient.getPA().sendFrame126("[" + staffRanksNamesForPlayer.toString()
         + "]@cya@" + Misc.formatPlayerName(player) + ": ", index);
    

还有一件事:通常您要指定您正在使用的特定Multimap 接口:ListMultimapSetMultimap

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2012-12-28
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多