Древовидная карта Григорианскалендаров
Я создал TreeMap из <GregorianCalendar, Integer> для хранения дат, в которых были введены високосные секунды GPS:
leapSecondsDict = new TreeMap<GregorianCalendar, Integer>();
GregorianCalendar calendar =
new GregorianCalendar(TimeZone.getTimeZone("UTC"));
calendar.set(1981, GregorianCalendar.JUNE, 30, 23, 59, 59);
leapSecondsDict.put(calendar, 1);
calendar.set(1982, GregorianCalendar.JUNE, 30, 23, 59, 59);
leapSecondsDict.put(calendar, 2);
calendar.set(1983, GregorianCalendar.JUNE, 30, 23, 59, 59);
leapSecondsDict.put(calendar, 3);
Проблема в том, что каждый раз, когда я вызываю put, TreeMap содержит только последний вставленный элемент, и размер остается 1.
Почему это происходит?
Я предполагаю, что при использовании Calendar в качестве ключа Ключ является идентификатором экземпляра класса, а не его значением, поэтому при вставке второго элемента в TreeMap я буду обновлять существующую запись тем же ключом, даже если этот ключ теперь это тот же класс с другим значением.
Calendar для каждой записи?2 ответа:
Метод
setне создает новый методCalendar, он все тот же, но с другим значением. Поэтому, когда вы добавляете его вMap, он просто обновляет значение как свой же ключ, вы всегда ссылаетесь на один и тот же объект. Вам нужно создать новый экземпляр для каждого из ключей.
Как Balduz комментирует:
Метод set не создает новый календарь, он все тот же, но с другим значением. Поэтому, когда вы добавляете его на карту, он просто обновляет значение как свой же ключ, вы всегда ссылаетесь на один и тот же объект. Вам нужно создать новый экземпляр для каждого из ключей.
Таким образом, вы должны создавать новый каждый раз, что-то вроде:
GregorianCalendar calendar1 = new GregorianCalendar(1981, GregorianCalendar.JUNE, 30, 23, 59, 59); calendar1.setTimeZone(TimeZone.getTimeZone("UTC")); leapSecondsDict.put(calendar1, 1); GregorianCalendar calendar2 = new GregorianCalendar(1982, GregorianCalendar.JUNE, 30, 23, 59, 59); calendar2.setTimeZone(TimeZone.getTimeZone("UTC")); leapSecondsDict.put(calendar2, 2); GregorianCalendar calendar3 = new GregorianCalendar(1983, GregorianCalendar.JUNE, 30, 23, 59, 59); calendar3.setTimeZone(TimeZone.getTimeZone("UTC")); leapSecondsDict.put(calendar3, 3);