Помогите Правильное считывание конфига

Exception_Prototype

Активный участник
Пользователь
Баллы
96
Есть такой код, который читает с конфига лист материалов предметов и оригинальное название.
Java:
        private HashMap<Material, String> WeaponsName = new HashMap<>();
        //Где то там и конфиг подгрузился.

        if (weapons.contains("test")) {
            WeaponsName = (HashMap) weapons.getConfigurationSection("test").getValues(false);
        } else {
            LOGGER.info("Debug error");
        }
Вопрос в следующем:
1. Как при считывании ключ сразу преобразовать в Material? Я прост не понимаю на какой стадии это делать.
2. Стоит ли вообще его преобразовывать? Может пусть будет строкой и сравнить строкой?
Просто... Я считаю, что взять hashcode с числа и сравнить его будет менее подвергнуто нагрузке, чем получение hashcode со строки.
 
пример конфига напиши.

твой код на мой взгляд вообще не подходит к ситуации. я вообще не понял что ты попытался этим кодом сделать
 
Этот код работает уже очень долго, я таким кодом получал конфиг ниже сразу в HashMap.
test:
mat1: name1
mat1: name1
mat1: name1
Только теперь мне нужно key перед добавлением преобразовать в Material или нет... Ну вот я и задал вопрос.

P.S. Прочитайте новую подпись)
Вот так я сделал преобразование в Material.
Java:
        if (weapons.contains("flans")) {

            for (Map.Entry entry : weapons.getConfigurationSection("flans").getValues(false).entrySet()) {
                WeaponsName.put(Material.getMaterial(entry.getKey().toString()), entry.getValue().toString());
            }

        } else {
            LOGGER.info(CONSOLE_PREFIX + "Debug error");
        }
 
Последнее редактирование:
Java:
Material m = Material.getMaterial("Your string".toUpperCase());//получит материал по строке типа STONE ACACIA_DOOR и т.п
Material m = Material.matchMaterial("string"); //получит материал из строки "1"-камень, "stone"- камень а вообще ниже код этого метода

Java:
public static Material matchMaterial(String name) {
        Validate.notNull(name, "Name cannot be null");

        Material result = null;
        try {
            result = getMaterial(Integer.parseInt(name));
        } catch (NumberFormatException localNumberFormatException) {
        }
        if (result == null) {
            String filtered = name.toUpperCase(Locale.ENGLISH);

            filtered = filtered.replaceAll("\\s+", "_").replaceAll("\\W", "");
            result = (Material) BY_NAME.get(filtered);
        }

        return result;
    }

P.S. Прочитайте новую подпись)
Скуп шлак - используй дискорд.
 
Да не, шкуре форева. Не хочется переходить на другое. Слишком много уже конференций важных в скайпе.
Мой метод получения? Как Вам? Ведь по сути тоже самое что и у вас (в первом случае).
Так всё же, лучше Material или String?
 
Да не, шкуре форева. Не хочется переходить на другое. Слишком много уже конференций важных в скайпе.
Мой метод получения? Как Вам? Ведь по сути тоже самое что и у вас (в первом случае).
Так всё же, лучше Material или String?
ну я так понял ты делаешь словарь.

соответственно где то в коде ты будешь вытаскивать материал вещи и доставать из хэшмапы по имени либо сразу по материалу.

В hashmap в конечном итоге дело упирается в equals, a equals у енума перезаписан на "==", т.е. работать будет быстрее чем сравнение строк.

А больше разницы наверное и нет
 
Java:
Material m = Material.getMaterial("Your string".toUpperCase());//получит материал по строке типа STONE ACACIA_DOOR и т.п
Material m = Material.matchMaterial("string"); //получит материал из строки "1"-камень, "stone"- камень а вообще ниже код этого метода

Java:
public static Material matchMaterial(String name) {
        Validate.notNull(name, "Name cannot be null");

        Material result = null;
        try {
            result = getMaterial(Integer.parseInt(name));
        } catch (NumberFormatException localNumberFormatException) {
        }
        if (result == null) {
            String filtered = name.toUpperCase(Locale.ENGLISH);

            filtered = filtered.replaceAll("\\s+", "_").replaceAll("\\W", "");
            result = (Material) BY_NAME.get(filtered);
        }

        return result;
    }


Скуп шлак - используй дискорд.
Material.valueOf(String name);
 
слишком не хорошо, надо в UpperCase переводить, пробелы убирать, символы специальные.

проще сразу

и все
Ну, при нормальной записи убирать лишние символы не нужно.Но, в большинстве случаев да, для чтения лучше использовать matchMaterial();, а valueOf() только когда мы уверены в параметрах входных данных.
 
когда мы уверены в параметрах входных данных.
Господи, да я даже в приватных методах побаиваюсь что какой ни будь чудак (на букву "м") через рефлексию туда что ни будь непотребное засунет, а ты про конфиг.

*истеричный смех*
*еще истеричный смех*
 
Господи, да я даже в приватных методах побаиваюсь что какой ни будь чудак (на букву "м") через рефлексию туда что ни будь непотребное засунет, а ты про конфиг.

*истеричный смех*
*еще истеричный смех*
Используй final и не подсунет.
 
Вопрос в следующем:
1. Как при считывании ключ сразу преобразовать в Material? Я прост не понимаю на какой стадии это делать.
Ну как из конфига строку получаешь, так сразу в материал и можешь преобразовывать.
2. Стоит ли вообще его преобразовывать? Может пусть будет строкой и сравнить строкой?
Просто... Я считаю, что взять hashcode с числа и сравнить его будет менее подвергнуто нагрузке, чем получение hashcode со строки.
Правильно считаешь, стоит
 
Ну как из конфига строку получаешь, так сразу в материал и можешь преобразовывать.
Правильно считаешь, стоит
Ему уже ответили же. valueOf ему подойдет.

Java:
        try {
            Material m = Material.valueOf(name);
        } catch (Exception e) {
            player.sendMessage("Сорян,"+name+" не существует!");
        }
 
Назад
Верх