У меня вопрос на Java о лучшем способе работы со следующим предоставленным мне файлом enum.
public enum Foo{
PLANE(1, "Plane", "plane"),
CASTLE(2, "Castle", "castle"),
FEILD(3, "Feild", "field"),
ROAD(4, "Road", new String[] {"road", "pavement"});
}
Есть примерно 100 записей в вышеуказанных форматах
/**
* Stores a map of the names for fast access. Stores a map of the IDs for fast access.
*/
private static final Map<Integer,BlockType> ids = new HashMap<Integer,BlockType>();
private static final Map<String,BlockType> lookup = new HashMap<String,BlockType>();
private final int id;
private final String name;
private final String[] lookupKeys;
static {
for(Foo type : EnumSet.allOf(Foo.class)) {
ids.put(type.id, type);
for (String key : type.lookupKeys) {
lookup.put(key, type);
}
}
}
/**
* Construct the type.
*
* @param id
* @param name
*/
Foo(int id, String name, String lookupKey) {
this.id = id;
this.name = name;
this.lookupKeys = new String[]{lookupKey};
}
/**
* Construct the type.
*
* @param id
* @param name
*/
Foo(int id, String name, String[] lookupKeys) {
this.id = id;
this.name = name;
this.lookupKeys = lookupKeys;
}
/**
* Return type from ID. May return null.
*
* @param id
* @return
*/
public static Foo fromID(int id) {
return ids.get(id);
}
/**
* Return type from name. May return null.
*
* @param name
* @return
*/
public static Foo lookup(String name) {
return lookup.get(name.toLowerCase());
}
/**
* Get block numeric ID.
*
* @return
*/
public int getID() {
return id;
}
/**
* Get user-friendly name.
*
* @return
*/
public String getName() {
return name;
}
Итак, что я пытаюсь сделать с этим перечислением: пользователь запускает команду, например: / bounce 1
Программа распознает bounce как команду и выглядитдля следующего аргумента.Поскольку 1 следует за командой, теперь он проверяет, является ли 1 допустимым идентификатором # в перечислении.Если это так, он выполняет команду.
Пользователь выдает команду для примера 2 в следующем виде: / bounce plane.На этот раз он проверяет, является ли строка допустимым строковым именем в перечислении, и захватывает ли ID, связанный с ним, для выполнения команды.
Как я могу проверить эти критерии, что либо идентификаторили один из идентификаторов строки существует и всегда возвращает идентификатор # для последующего использования.Буду признателен за любую помощь.
Следует также отметить, что этот enum-файл является собственным независимым файлом классов, вызываемым из основного.
Спасибо всем, кто помог мне встать на правильный путь.Я наградил Wolfcastle правильным ответом, вот что я получил, чтобы работать на меня, но я все еще открыт для любых критических замечаний по поводу логики или недостатков производительности с моим методом.
String s = null;
try {
s = in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
id = Integer.parseInt(s);
} catch (NumberFormatException nfe) {
}
if (BlockType.lookup(s) != null
|| BlockType.fromID(id) != null) {
if (BlockType.lookup(s)!= null) {
blockname = BlockType.lookup(s).getName();
blockid = BlockType.lookup(s).getID();
} else {
blockname = BlockType.fromID(id).getName();
blockid = BlockType.fromID(id).getID();
}
}