Проблема с назначением случайного UUID в качестве ключа карты - PullRequest
0 голосов
/ 21 января 2020

Я делаю диспетчерскую (диспетчерскую) программу. Хотя мне удалось создать метод "addReport", у меня есть проблемы с отображением всех отчетов (переход по карте). Я думаю, что каждый раз, когда я пытаюсь добавить новые элементы, они заменяются, потому что идентификатор (UUID) один и тот же. Как вы думаете, или, может быть, это что-то другое?

public class Dispatching {
    private String identificator;
    private Map<String, Report> reportMap;

    public Dispatching() {
        this.identificator = UUID.randomUUID().toString();
        this.reportMap = new HashMap<>();
    }

    void addReport(String message, ReportType type) {
        reportMap.put(identificator, new Report(type, message, LocalTime.now()));
    }

    void showReports() {
        for (Map.Entry element : reportMap.entrySet()) {
            System.out.println("uuid: " + element.getKey().toString()
                    + " " + element.getValue().toString());
        }
    }

}

public class Report {
    ReportType reportType;
    String reportMessage;
    LocalTime reportTime;


    public Report(ReportType reportType, String reportMessage, LocalTime reportTime) {
        this.reportType = reportType;
        this.reportMessage = reportMessage;
        this.reportTime = reportTime;

    }

    @Override
    public String toString() {
        return "Report{" +
                "reportType=" + reportType +
                ", reportMessage='" + reportMessage + '\'' +
                ", reportTime=" + reportTime +
                '}';
    }
}

public class Main {

    public static void main(String[] args) {
        Dispatching dispatching = new Dispatching();

        dispatching.addReport("heeeeelp",ReportType.AMBULANCE);
        dispatching.addReport("poliiiice",ReportType.POLICE);
        dispatching.addReport("treeee",ReportType.OTHER);

        dispatching.showReports();

    }



}

public enum ReportType {
    AMBULANCE,
    POLICE,
    FIRE_BRIGADE,
    ACCIDENT,
    OTHER
}

Ответы [ 2 ]

5 голосов
/ 21 января 2020

Вы генерируете UUID только один раз в конструкторе и повторно используете его внутри addReport, и в конце концов, карта сохранит только последнюю запись для того же ключа, поэтому сгенерируйте новый идентификатор, используя

void addReport(String message, ReportType type) {
        reportMap.put(UUID.randomUUID().toString(), new Report(type, message, LocalTime.now()));
    }
2 голосов
/ 21 января 2020

Да. Вы правы.

void addReport(String message, ReportType type) {
    reportMap.put(identificator, new Report(type, message, LocalTime.now()));
}

Ваш идентификатор одинаков для каждого добавляемого отчета. Следовательно, он перезапишет запись на карте.

Вы должны использовать разные идентификаторы для каждого добавляемого отчета. Выбор этого идентификатора зависит от вашего варианта использования. Возможно, вы можете создать UUID каждый раз, когда вставляете в карту. Или вы можете сделать так, чтобы каждый Report имел свой собственный идентификатор.

Это зависит .. Должен ли вызов addReport для одного и того же сообщения и типа отчета создать две записи в reportMap? Если нет, то вам нужно иметь идентификатор для Report.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...