Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by Exception_Prototype, Feb 15, 2017.

  1. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Trophy Points:
    46
    Есть такой код, который читает с конфига лист материалов предметов и оригинальное название.
    Code:
            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 со строки.
     
  2. Хостинг MineCraft
    <
  3. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    пример конфига напиши.

    твой код на мой взгляд вообще не подходит к ситуации. я вообще не понял что ты попытался этим кодом сделать
     
  4. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Trophy Points:
    46
    Этот код работает уже очень долго, я таким кодом получал конфиг ниже сразу в HashMap.
    test:
    mat1: name1
    mat1: name1
    mat1: name1
    Только теперь мне нужно key перед добавлением преобразовать в Material или нет... Ну вот я и задал вопрос.

    P.S. Прочитайте новую подпись)[DOUBLEPOST=1487150760,1487149240][/DOUBLEPOST]Вот так я сделал преобразование в Material.
    Code:
            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");
            }
    
     
    Last edited: Feb 15, 2017
  5. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    Code:
    Material m = Material.getMaterial("Your string".toUpperCase());//получит материал по строке типа STONE ACACIA_DOOR и т.п
    Material m = Material.matchMaterial("string"); //получит материал из строки "1"-камень, "stone"- камень а вообще ниже код этого метода
    
    Code:
    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;
        }
    
    [DOUBLEPOST=1487150841,1487150767][/DOUBLEPOST]
    Скуп шлак - используй дискорд.
     
  6. Автор темы
    Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Trophy Points:
    46
    Да не, шкуре форева. Не хочется переходить на другое. Слишком много уже конференций важных в скайпе.
    Мой метод получения? Как Вам? Ведь по сути тоже самое что и у вас (в первом случае).
    Так всё же, лучше Material или String?
     
  7. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    ну я так понял ты делаешь словарь.

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

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

    А больше разницы наверное и нет
     
  8. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    Material.valueOf(String name);
     
  9. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    может сразу по id пойдем получать?
     
  10. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    Не понял тебя.
     
  11. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    слишком не хорошо, надо в UpperCase переводить, пробелы убирать, символы специальные.

    проще сразу
    и все
     
  12. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    Ну, при нормальной записи убирать лишние символы не нужно.Но, в большинстве случаев да, для чтения лучше использовать matchMaterial();, а valueOf() только когда мы уверены в параметрах входных данных.
     
  13. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    Господи, да я даже в приватных методах побаиваюсь что какой ни будь чудак (на букву "м") через рефлексию туда что ни будь непотребное засунет, а ты про конфиг.

    *истеричный смех*
    *еще истеричный смех*
     
  14. alexandrage

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Используй final и не подсунет.
     
  15. Dymeth

    Dymeth Активный участник Пользователь

    Trophy Points:
    76
    Ну как из конфига строку получаешь, так сразу в материал и можешь преобразовывать.
    Правильно считаешь, стоит
     
  16. alexandrage

    alexandrage Администратор

    Trophy Points:
    173
    Skype:
    alexandr0116
    Ему уже ответили же. valueOf ему подойдет.

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

Share This Page