Добрая Зинаида и летние каникулы

  • 10
  • Недоступна
Зинаида Васильевна — классный руководитель 7-Б класса какой-то там террианской школы, подробности не важны. А важно то, что она дарит подарки ученикам в дни рождения. Везет не всем: летние именинники — в пролёте по причине каникул. Пишем программу для Зинаиды: создаем словарь с фамилиями и датами рождения, удаляем из него людей, родившихся летом.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (506)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Андрей10 уровень, Москва
суббота, 21:33
Выполнил два решения: 1. С использованием Iterator (один цикл ищет и удаляет); 2. С набором ключей в Set (отдельный цикл для удаления, тк в одном цикле напрямую с обрабатываемой коллекции сразу удалять элементы нельзя). В обоих случаях без Calendar не обошлось. В зачёт отправил 1. Просто жребий. Количество строк в обоих случаях одинаково ( 8, учитывая фигурную скобку цикла, не считая отступы)
пятница, 20:50
Хоть задача и не стоит того затраченого времени, использованое, чтобы её решить, но вот класс SimpleDateFormat действительно интересен. Решил так: Сделал ещё один SimpleDateFormat в removeAllSummerPeople, но так, чтобы он делал только месяц. Вычисление месяца (от 5 до 9 (от мая до сентября)), и потом удаление элемента. Если интересно, как ещё можно настроить SimpleDateFormat, вот ссылка. Там не всё по теме, но почитать также стоит.УЧТИТЕ, что сразу в цикле, в котором Вы проходитесь по всем элементам коллекции вносить в неё изменения НЕЛЬЗЯ!!! Будет ConcurrentModificationException при запуске (в самой задаче метод не запускается, поэтому Вам ничего не напишет). Чтобы этого избежать я сделал ArrayList, и в него включал все фамилии, которые родились летом. Тогда в следующем цикле проходился по всем элементам этого ArrayList'а, и удалял из коллекции эти фамилии (кто не понял как, то объясняю: метод Map'а remove(String key) работает с ключами коллекции, по этому сохранять нужно их). Если Вас не пропускает злой дядька валидатор, просто попробуйте скомпилировать свой код. Можете поискать в гугле, но если лень вот тот, которым я пользуюсь.
Alexandr Vlasov13 уровень, Москва
пятница, 12:35
.removeIf( в этой задаче спаситель
Иван13 уровень, Москва
четверг, 12:47
Как получить нужный месяц и не лезть в гугл: Т.к. готовый код программы нельзя показывать, я расскажу суть и покажу малую часть. Мы имеем некоторую конкретную дату. Как мы знаем, все даты в классе Data можно получить в виде миллисекунд от начала конкретной даты(1 января 1970 года, по Гринвичу). Что же мы можем сделать с датой, чтобы получить необходимый месяц? Давайте переведём дату на начало года. Далее мы сможем узнать разницу между началом года и текущим моментом даты. Данная разница позволит узнать сколько миллисекунд прошло от начала года! Осталось дело за малым - перевести полученные миллисекунды в месяцы, это можно сделать посчитав количество миллисекунд по минимальному месяцу (28 дней - февраль) (28 * 24 * 60 * 60 * 1000) и разделить разницу на полученное число.
public static int getMonth(Date date) {
   Date startYear =  new Date(), endYear = new Date(); // Инициализируем переменные под начало года и саму дату

   long msInMoth = 28 * 24 * 60 * 60 * 1000L; // Считаем количество миллисекунд в месяце (1000L - скажет компилятору, что нам нужно получить число с типом long)

   // Получаем время от передаваемой в метод даты
   startYear.setTime(date.getTime());
   endYear.setTime(date.getTime());

   // Получаем дату с начала года
   startYear.setDate(1);
   startYear.setMonth(0);

   return (int)((endYear.getTime() - startYear.getTime()) / msInMoth); // Получаем месяц текущей даты (нумерация начинается с 0)
}
Azat Burkhanov15 уровень, Казань
29 июля, 08:14
5, 6, 7 месяцы нужны. Сделал вначале 6-8, а потом думал что не так долго).
Мариам10 уровень
27 июля, 17:24
Rush-овская статья про классы Date и Calendar
mixk888 уровень, Красноярск
25 июля, 18:44
мне помогла эта статья https://www.codeflow.site/ru/article/java-year-month-day, решил через преобразование Date в Calendar, там можно легко получить из даты день, месяц или год в целочисленном значении
Дмитрий8 уровень, Ставрополь
воскресенье, 18:02
весьма неплохо. как пришли к этой ссылке, как запрос в гугле оформили?
B. RIDER15 уровень, Братислава
24 июля, 17:34
У меня логика закончилась на 8 уровне, теперь просто смотрю в коментах как кто-то что там сделал и пытаюсь подсознанием впитаь информацию
Станислав22 уровень, Москва
22 июля, 14:51
Несколько ссылок, которые могут помочь: Date, Calendar etc Получайте день, месяц и год отдельно, используя SimpleDateFormat Возможно, столкнётесь с ошибкой: ConcurrentModificationException
Дмитрий9 уровень, Днепр
15 июля, 19:24
Уффф, совсем тяжко стало... Задачу решил, разумеется, не без помощи комментариев. Но возник вопрос. Валидация прошла, все ок. Но я хочу сам посмотреть как по итогу выглядит мапа.
public static void main(String[] args) throws ParseException {
removeAllSummerPeople(createMap());
for (Map.Entry entry : createMap().entrySet()) {
            System.out.println(entry.getKey()  + " - " + entry.getValue());
        }
    }
И в итоге мне выводится массив без изменений. Какого хлебушка, что я делаю не так ?
Максим10 уровень, Днепр
20 июля, 13:54
Вы в цикле forEach создаёте новую мапу, а изменяете старую(у вас создаётся 2 мапы в методе main()). Можно перед вызовом метода removeAllSummerPeople() создать мапу через метод createMap() и сразу же передать её какой-то переменной, условно назовём её guys, а потом guys уже передавать в метод removeAllSummerPeople() и в ваш forEach. Надеюсь, помог)