|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Расчет распределений параметров маршрутовДля отображения суммарных значений показателей по группам маршрутов использовался GraphsDataCalculator, он имеет более сложную структуру, чем калькулятор статистики, за счет того, что работает с базой. Расчет суммы показателя(продолжительности, расстояния) по группе простая задача, но формирование множества маршрутов самой группы представляет сложность, а учтя, что показатели имеют значение только в привязке с группой, калькулятор был настроен на работу с временной группой. Выдаваемый результат представляет объект, созданный для дальнейшего удобного представления в графиках: public class GraphsDataResult { private List<Long> dates = new ArrayList<>(); private List<Double> distance = new ArrayList<>(); private List<Long> duration = new ArrayList<>(); public List<Long> getDates() { return dates; } public List<Double> getDistance() { return distance; } public List<Long> getDuration() { return duration; } } Формирование множества маршрутов группы представляет собой формирование специфического запроса. Даты необходимо формировать в правильном формате- если временной промежуток не будет расширен(включение границ), могут быть потеряны некоторые маршруты: GraphsDataResult result = new GraphsDataResult(); final VelocityDatabaseHelper helper = OpenHelperManager.getHelper(context, VelocityDatabaseHelper.class); try { List<RouteEntity> filteredRoutes = new ArrayList<>(); Calendar begin = Calendar.getInstance(); begin.setTime(aStart); begin.set(Calendar.HOUR, 0); begin.set(Calendar.MINUTE, 0); begin.set(Calendar.SECOND, 0); // Calendar end = Calendar.getInstance(); end.setTime(aFinish); end.set(Calendar.HOUR, 23); end.set(Calendar.MINUTE, 59); end.set(Calendar.SECOND, 59); try { final List<RouteEntity> routes = helper.getSimpleRouteEntityDao() .queryBuilder() .where() .ge("dateStart", begin.getTime()) .and() .le("dateStart", end.getTime()) .and() .ge("dateFinish", begin.getTime()) .and() .le("dateFinish", end.getTime()) .query(); filteredRoutes.addAll(routes); } catch (SQLException sqlEx) { Log.e(StatisticsCalculator.class.getName(), "Error has occurred while querying for dateRange", sqlEx); } Распределение по группам, основанным на временных периодах, происходит по следующей схеме: 1)Формирование карт для хранение результатов ключи-даты, значения- суммарные показатели параметров. 2)Обходя множество маршрутов извлекаем необходимые значения параметров, формируем ключ для карт результатов, получаем сохраненное значение параметра, либо создаем пустое, добавляем извлеченные из маршрута значения в карты значений. 3) Переводим карты значений в результирующий объект. Код выполняющий эти операции на примере распределения по дням: Map<Date, Double> distanceMap = new TreeMap<>(); Map<Date, Long> timeMap = new TreeMap<>(); Calendar calendar = Calendar.getInstance(); for (RouteEntity route: filteredRoutes) { calendar.clear(); calendar.setTime(route.getDateStart()); calendar.set(Calendar.HOUR, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); Date key = calendar.getTime();
Double distance = distanceMap.get(key); Long time = timeMap.get(key);
if (distance == null) { distance = 0d; } if (time == null) { time = 0L; } distance = distance + route.getDistance(); distanceMap.put(key, distance); time = time + route.getDateFinish().getTime() - route.getDateStart().getTime(); timeMap.put(key, time); } for (Date key: distanceMap.keySet()) { result.getDistance().add(distanceMap.get(key)); result.getDuration().add(timeMap.get(key)); result.getDates().add(key.getTime()); }
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |