Помогите Распарсить БД для вывода топов

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

g1tufix

Активный участник
Пользователь
Баллы
61
Есть файл levels.yml
Код:
ник_игрока:
    level: 60
    kills: 800
    и так далее, несколько параметров для каждого игрока
как распарсить файл таким образом, что бы вывести тпо 10 игроков по каждому из значений?
Если это невозможно, то как лучше это сделать? Тип, создать файл с другой базой именно для топа (top.yml, например) и оформлять иначе? Можно советы, пример кода?
 
Данные лучше хранить в базах данных типа MySQL, MariaDB или подобных других. Ибо хранение в .yml файлах уже старый очень метод.
 
Данные лучше хранить в базах данных типа MySQL, MariaDB или подобных других. Ибо хранение в .yml файлах уже старый очень метод.
Можно ещё хранить в локальной Sql, будет сохраняться в файле .db
 
Данные лучше хранить в базах данных типа MySQL, MariaDB или подобных других. Ибо хранение в .yml файлах уже старый очень метод.
Я пока что новичок в этом, первая версия моего плагина будет сохранять в YML, потом планирую переходить на MySql
У меня не получится сделать топы, если я не изменю на бд mysql?
 
Ну сортируешь по уменьшению и выводишь первый 10 элементов массива.
 
Ну сортируешь по уменьшению и выводишь первый 10 элементов массива.
а лучше пускай сядет и выучит как работать с базами данных, ему же проще будет в дальнейшем. С базами куда проще чем с конфигами.
 
как распарсить файл таким образом, что бы вывести тпо 10 игроков по каждому из значений?
Если это невозможно, то как лучше это сделать? Тип, создать файл с другой базой именно для топа (top.yml, например) и оформлять иначе? Можно советы, пример кода?
Сделать так можно, но это будет запарно. Нужно будет создать класс который будет содержать нужные поля из файла для каждого игрока и этот класс должен implements ConfigurationSerializable.
Ну и потом читать этот файл.

Но так лучше не делать, т.к. в будущем этот файл levels.yml может раздуться, станет большим и плагин будет больше тратить времени на чтение этого файла. А потом что-то может заглючить и статистика поломается.

Поэтому лучше разобраться как работать с базами данных. Например, будет отличным вариант выучить SQLite.
Вот туториал на русском: https://coderlessons.com/tutorials/bazy-dannykh/vyuchit-sqlite/sqlite-java
Там по сути ничего сложного нет. Вставить данные, обновить данные и прочитать данные. Это всё, что тебе будет нужно. Ну и создать таблицу с нужными колонками для хранения статистики.
 
+- так:
PHP:
public class TopNode {

    private final String playerName;
    private int level;
    private int kills;

    public static final Comparator<TopNode> LEVEL_COMPARATOR = new LevelComparator();
    public static final Comparator<TopNode> KILLS_COMPARATOR = new KillsComparator();


    public TopNode(String playerName, int level, int kills) {
        this.playerName = playerName;
        this.level = level;
        this.kills = kills;
    }

    public TopNode(String playerName) {
        this.playerName = playerName;
    }

    public String getPlayerName() {
        return playerName;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public int getKills() {
        return kills;
    }

    public void setKills(int kills) {
        this.kills = kills;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TopNode topNode = (TopNode) o;
        return Objects.equals(playerName, topNode.playerName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(playerName);
    }

    @Override
    public String toString() {
        return "TopNode{" +
                "playerName='" + playerName + '\'' +
                ", level=" + level +
                ", kills=" + kills +
                '}';
    }

    public enum CompareType {
        LEVEL,
        KILLS
    }

    private static final class LevelComparator implements Comparator<TopNode> {

        @Override
        public int compare(TopNode o1, TopNode o2) {
            return Integer.compare(o1.getLevel(), o2.getLevel());
        }
    }

    private static final class KillsComparator implements Comparator<TopNode> {

        @Override
        public int compare(TopNode o1, TopNode o2) {
            return Integer.compare(o1.getKills(), o2.getKills());
        }
    }
}
PHP:
    public List<TopNode> deserialize(Configuration configuration) {
        List<TopNode> nodes = new ArrayList<>();
        configuration.getKeys(false).forEach(key -> {
            ConfigurationSection playerSection = configuration.getConfigurationSection(key);
            if (playerSection == null) return;
            int level = playerSection.getInt("level");
            int kills = playerSection.getInt("kills");
            nodes.add(new TopNode(key /*nickname*/, level, kills));
        });
        return nodes;
    }
PHP:
    public List<TopNode> getTop(List<TopNode> nodes, TopNode.CompareType compareType, int count, boolean reversed) {
        Comparator<TopNode> comparator = switch (compareType) {
            case LEVEL -> TopNode.LEVEL_COMPARATOR;
            case KILLS -> TopNode.KILLS_COMPARATOR;
        };
        return nodes.stream()
                .sorted(reversed ? comparator.reversed() : comparator)
                .limit(count)
                .collect(Collectors.toList());
    }
Но всё же лучше использовать БД.
 
Последнее редактирование:
+- так:
PHP:
public class TopNode {

    private final String playerName;
    private int level;
    private int kills;

    public static final Comparator<TopNode> LEVEL_COMPARATOR = new LevelComparator();
    public static final Comparator<TopNode> KILLS_COMPARATOR = new KillsComparator();


    public TopNode(String playerName, int level, int kills) {
        this.playerName = playerName;
        this.level = level;
        this.kills = kills;
    }

    public TopNode(String playerName) {
        this.playerName = playerName;
    }

    public String getPlayerName() {
        return playerName;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public int getKills() {
        return kills;
    }

    public void setKills(int kills) {
        this.kills = kills;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TopNode topNode = (TopNode) o;
        return Objects.equals(playerName, topNode.playerName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(playerName);
    }

    @Override
    public String toString() {
        return "TopNode{" +
                "playerName='" + playerName + '\'' +
                ", level=" + level +
                ", kills=" + kills +
                '}';
    }

    public enum CompareType {
        LEVEL,
        KILLS
    }

    private static final class LevelComparator implements Comparator<TopNode> {

        @Override
        public int compare(TopNode o1, TopNode o2) {
            return Integer.compare(o1.getLevel(), o2.getLevel());
        }
    }

    private static final class KillsComparator implements Comparator<TopNode> {

        @Override
        public int compare(TopNode o1, TopNode o2) {
            return Integer.compare(o1.getKills(), o2.getKills());
        }
    }
}
PHP:
    public List<TopNode> deserialize(Configuration configuration) {
        List<TopNode> nodes = new ArrayList<>();
        configuration.getKeys(false).forEach(key -> {
            ConfigurationSection playerSection = configuration.getConfigurationSection(key);
            if (playerSection == null) return;
            int level = playerSection.getInt("level");
            int kills = playerSection.getInt("kills");
            nodes.add(new TopNode(key /*nickname*/, level, kills));
        });
        return nodes;
    }
PHP:
    public List<TopNode> getTop(List<TopNode> nodes, TopNode.CompareType compareType, int count) {
        Comparator<TopNode> comparator = switch (compareType) {
            case LEVEL -> TopNode.LEVEL_COMPARATOR;
            case KILLS -> TopNode.KILLS_COMPARATOR;
        };
        return nodes.stream()
                .sorted(comparator.reversed())
                .limit(count)
                .collect(Collectors.toList());
    }
Но всё же лучше использовать БД.
Сделать так можно, но это будет запарно. Нужно будет создать класс который будет содержать нужные поля из файла для каждого игрока и этот класс должен implements ConfigurationSerializable.
Ну и потом читать этот файл.

Но так лучше не делать, т.к. в будущем этот файл levels.yml может раздуться, станет большим и плагин будет больше тратить времени на чтение этого файла. А потом что-то может заглючить и статистика поломается.

Поэтому лучше разобраться как работать с базами данных. Например, будет отличным вариант выучить SQLite.
Вот туториал на русском: https://coderlessons.com/tutorials/bazy-dannykh/vyuchit-sqlite/sqlite-java
Там по сути ничего сложного нет. Вставить данные, обновить данные и прочитать данные. Это всё, что тебе будет нужно. Ну и создать таблицу с нужными колонками для хранения статистики.
Я уже выше отвечала чтобы он изучил базы данных, ибо с ними будет позже проще.
 
Назад
Верх