我有以下枚举,但我想迭代第二个参数而不必迭代这个类别之外的枚举成员,所以如果我有一个message
:“消息”和类别"Category"
我可以在方法isMessageInGroup
中将类别指定为参数,而不必迭代其他类别MESSAGE_3
的类别:“另一个类别”
有没有一种巧妙的方法来节省一些迭代时间?可能甚至没有大量的价值,这将显着影响性能,但我想知道是否可能。搜索了一下但很难找到这个具体的问题。
下面的Enum确实按类别对邮件收费但我想知道我是否可以避免迭代那些想要的类别之外的邮件
public enum MessagesEnum {
MESSAGE_1("Message", "Category"),
MESSAGE_2("Another Message", "Category"),
MESSAGE_3("Odd Message", "Another Category");
private final String message;
private final String category;
SabreErrorMessages(String message, String errorCategory) {
this.message = message;
this.category = category;
}
public String getMessage() {
return message;
}
public String getCategory() {
return category;
}
public static boolean isMessageInGroup(String message){
for(MessagesEnum message : MessagesEnum.values()) {
if(message.contains(message.getMessage()) && message.getCategory().equals("Category")) {
return true;
}
}
return false;
}
}
答案 0 :(得分:5)
正如评论所说,开箱即用的枚举不会对此最有效,因为你必须使用迭代器。但是,HashMap
平均提供O(1)查找,并且会更快。
public enum Messages {
MESSAGE_1("Message", "Category"),
MESSAGE_2("Another Message", "Category"),
MESSAGE_3("Odd Message", "Another Category");
private static final Map<String, Set<String>> map = new HashMap<>();
static {
for (Messages m : Messages.values()) {
map.computeIfAbsent(m.category, s -> new HashSet<>()).add(m.message);
}
}
private final String message, category;
private Messages(String message, String category) {
this.message = message;
this.category = category;
}
public String getMessage() { return message; }
public String getCategory() { return category; }
public static boolean isMessageInGroup(String message){
// use `getOrDefault` if `get` could return null!!
return map.get("Category").contains(message);
}
}
编辑:如果您选择实施messagesInGroup
之类的方法,最安全的方法是使用不可修改的Set
来实现它,以保护其完整性enum的内部。
public static Set<String> messagesInGroup(String category) {
return Collections.unmodifiableSet(
map.getOrDefault(category, Collections.emptySet())
);
}