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

  • Автор темы Автор темы Lignium
  • Дата начала Дата начала

Lignium

Активный участник
Пользователь
Баллы
66
Имя в 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 и т.д.

В общем, буду рад любой помощи)
 
Что то подобное, писал без IDE. Надеюсь суть понятна.
Java:
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();
        }   
}
 
Что то подобное, писал без IDE. Надеюсь суть понятна.
Java:
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();
        }  
}
Пора за такой код сажать.
 
Ага, будет дофига объектов в секции, неожиданно начнуться лаги, даже не знаю, из - за чего
Дык кто же с большой структурой такой постоянно работать будет? Отбитый разве что какой-то.
Конфиг служит для временного хранения данных пока сервер перезапускается. Далее нужно его при старте прочитать в память и забыть до выключения сервера(чтобы сохранить данные из памяти в конфиг).
ТС не говорил выше, что будет при каждом действии лезть в конфиг.
 
Последнее редактирование:
Дык кто же с большой структурой такой постоянно работать будет? Отбитый разве что какой-то.
Конфиг служит для временного хранения данных пока сервер перезапускается. Далее нужно его при старте прочитать в память и забыть до выключения сервера(чтобы сохранить данные из памяти в конфиг).
ТС не говорил выше, что будет при каждом действии лезть в конфиг.
Так можно и не постоянно.
 
В общем получилось как-то так
Код:
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));
    }
}
 
Назад
Верх