Во-первых, не map, а БД. В момент ввода пользователем города, ходить в БД, по имени города получать код и с ним делать запрос к расписанию. Табличку в БД лучше заполнить заранее нужными кодами, чтобы у свежеустановленного приложения сразу были данные, пусть даже не самые актуальные. Во-вторых, сделать фоновую задачу, которая будет периодически делать запрос к API Яндекса для обновления данных по кодам городов в БД. В-третьих, чтобы не жрать память мобильника, для парсинга 40-метрового файла использовать что-нибудь вроде Jackson Streaming API.