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

Помогите Работа с сложной структурой

Тема в разделе "Разработка плагинов для новичков", создана пользователем Lignium, 11 июн 2017.

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

    Lignium Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Lignium
    Здравствуйте, господа!) Есть такая проблема... Мне надо прочитать из файла конфигурации такую вот структуру:
    Код:
    drop-items:
      TOTEM:
        0: 90
        1: 10
      ENDER_PEARL:
        0: 85
        1: 15
    
      ...
    
      ROTTEN_FLESH:
        0: 40
        1: 30
        2: 30
    Тут записаны данные о предметах которые могут дропнуться в определенном количестве с определенной вероятностью (в процентах). Как правильно прочитать эти данные, получить Map<String, Map<Integer, Integer>>, да так, чтобы не писать горы кода с использованием циклов и метода MemorySection.getKeys(). Может эту YAML структуру можно переделать в более удобный вид?

    Я читал документацию, нашел такие интересные методы, вроде MemorySection.getMapList() и MemorySection.getValues(). MemorySection.getValues() например возвращает Map<String, Object>, и непонятно чем будет являться это значение с типом Object, если я попробую вызвать этот метод с путем "drop-items". Ключи понятно, будут строки TOTEM, ENDER_PEARL и т.д.

    В общем, буду рад любой помощи)
     
  2. Хостинг MineCraft
    <
  3. Exception_Prototype

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

    Баллы:
    46
    Что то подобное, писал без IDE. Надеюсь суть понятна.
    Код:
    public void ex(){
            if (getConfig().contains("drop-items")) {
               
                for (String key : getConfig().getConfigurationSection("drop-items").getKeys(false)) { //Здесь ты будешь бегать по TOTEM, ENDER_PEARL, ... ROTTEN_FLESH.
                   
                    for (String _key : getConfig().getConfigurationSection("drop-items." + key).getKeys(false)) { //Здесь ты будешь бегать по 0 ... n одной из секции выше.
                        int data = getConfig().getInt("drop-items." + key + "." + _key);
                        System.out.println(data);
                    }
                   
                }
               
               
            } else {
                getConfig().createSection("drop-items");
                saveConfig();
            }   
    }
    
     
  4. Автор темы
    Lignium

    Lignium Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Lignium
    Спасибо, решение неплохое, буду делать так
     
  5. Exception_Prototype

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

    Баллы:
    46
    Работает хотя бы?) Понятно всё?
     
  6. Автор темы
    Lignium

    Lignium Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Lignium
    Да, конечно работает) Вообще изначальная задача - избавится от Gson и использовать встроенные средства.
     
  7. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Пора за такой код сажать.
     
  8. Автор темы
    Lignium

    Lignium Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Lignium
    Хех, это да) Главное смысл понятен
     
  9. Exception_Prototype

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

    Баллы:
    46
    Предложи свой вариант, мне было бы интересно глянуть.
     
  10. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    Нормальный код...
     
  11. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    Ага, будет дофига объектов в секции, неожиданно начнуться лаги, даже не знаю, из - за чего
     
  12. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    А какие есть более оптимизированные способы?
     
  13. Exception_Prototype

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

    Баллы:
    46
    Дык кто же с большой структурой такой постоянно работать будет? Отбитый разве что какой-то.
    Конфиг служит для временного хранения данных пока сервер перезапускается. Далее нужно его при старте прочитать в память и забыть до выключения сервера(чтобы сохранить данные из памяти в конфиг).
    ТС не говорил выше, что будет при каждом действии лезть в конфиг.
     
    Последнее редактирование: 13 июн 2017
  14. TheZefirrkka

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

    Баллы:
    76
    Skype:
    RomaMamkinHasker1337
    Имя в Minecraft:
    TheZefirrkka
    Так можно и не постоянно.
     
  15. Автор темы
    Lignium

    Lignium Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    Lignium
    В общем получилось как-то так
    Код:
    dropItems = new HashMap<Material, Map<Integer, Double>>();
    
    ConfigurationSection dropItemsSection = configuration.getConfigurationSection("drop-items");
    
    for (String materialString: dropItemsSection.getKeys(false)) {
        Material material = Material.getMaterial(materialString);
      
        if (material != null) {
            ConfigurationSection materialSection = dropItemsSection.getConfigurationSection(materialString);
          
            Map<Integer, Double> table = new HashMap<Integer, Double>();
          
            for (String amountString: materialSection.getKeys(false)) {
                try {
                    int amount = Integer.parseInt(amountString);
                    double probability = materialSection.getDouble(amountString);
                  
                    table.put(amount, probability);
                } catch (NumberFormatException exception) {
                    exception.printStackTrace();
                }
            }
          
            dropItems.put(material, normalizeProbabilityTable(table));
        }
    }
     
  16. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Gson вообще хорошая либа, грамотная, но если юзать имеющееся, это конечно лучший вариант.
     

Поделиться этой страницей