Leaderboard.java

package io.github.neonteam10;

import java.io.*;
import java.util.*;

public class Leaderboard {
    Map<String, Integer> scores;
    String filename;
    public Leaderboard(String filename) {
        this.filename = filename;
        File f = new File(filename);
        if (!f.exists()) {
            try {
                f.createNewFile();
                scores = new HashMap<>();
                writeLeaderboard();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
        readLeaderboard();
    }

    // Typical usage after user selected:
    // leaderboard.addEntry("NEON10", (int) (satisfaction * 10));
    // leaderboard.writeLeaderboard();
    // score should be * 10.
    public void writeLeaderboard() {
        try {
            File file = new File(filename);
            FileOutputStream fileStream = new FileOutputStream(file);
            ObjectOutputStream objectStream = new ObjectOutputStream(fileStream);

            objectStream.writeObject(scores);
            objectStream.flush();
            objectStream.close();
            fileStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void readLeaderboard() {
        try {
            File file = new File(filename);
            FileInputStream fileStream = new FileInputStream(file);
            ObjectInputStream objectStream = new ObjectInputStream(fileStream);

            scores = (Map<String, Integer>) objectStream.readObject();

            objectStream.close();
            fileStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void addEntry(String username, int score) {
        scores.put(username, score);
    }

    public List<Map.Entry<String, Integer>> getTopFive() {
        List<Map.Entry<String, Integer>> topFive = new ArrayList<>();
        if (scores != null) {
            Set<Map.Entry<String, Integer>> entries = scores.entrySet();
            List<Map.Entry<String, Integer>> list = new ArrayList<>(entries);
            list.sort((entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue()));
            for (int i = 0; i < 5 && i < list.size(); i++) {
                topFive.add(list.get(i));
            }
        }
        return topFive;
    }

    @Override
    public String toString() {
        return scores.toString();
    }
}