|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Расчет статистики по группе маршрутовОсновной логической единицей представления данных является маршрут. Характеристики маршрута формируются в процессе записи(расстояние, время, географическое положение), некоторые могут задаваться позже или редактироваться(название, тип). Маршруты состоят из точек, представляя из себя набор данных о положении в пространстве(широта, долгота, высота над уровнем моря), времени, скорости и ускорении, точка дает полезную информацию только в совокупности с другими такими же точками. Их упорядоченное множество и составляет маршрут. При выборке данных за разные маршруты(это может быть группа маршрутов за определенный период или выбранных в зависимости от их типа) необходимо произвести пересчет данных(общее время расстояние, средние и максимальные значения скорости, продолжительности и пройденного расстояния за один маршрут) и перевести в формат, удобный для отображения. Задача калькулятора - считать, формирование данных для расчета задача обращающегося к расчету компонента. Сделав максимально простой метод расчета, удалось удачно разделить непосредственный расчет и формирование данных(в калькулятор передаются сами маршруты, никаких обращений к базе или внешним данным): public static StatisticsCalculationResult calculateStatistics(List<RouteEntity> routes) { StatisticsCalculationResult calculationResult = new StatisticsCalculationResult(); if (routes.size() > 0) { double distance = 0d; long time = 0L; long maxTime = 0L; double maxSpeed = 0d; double maxDistance = 0d; for (RouteEntity entity: routes) { final double routeDistance = entity.getDistance(); final long routeTime = entity.getDateFinish().getTime() - entity.getDateStart().getTime(); final double routeSpeed = entity.getMaxSpeed(); distance += routeDistance;
time += routeTime;
if (routeDistance > maxDistance) { maxDistance = routeDistance; } if (routeTime > maxTime) { maxTime = routeTime; }
if (routeSpeed > maxSpeed) { maxSpeed = routeSpeed; } } calculationResult.setRoutesAmount(routes.size()); calculationResult.setTotalDistance(distance); calculationResult.setAverageDistance(distance / routes.size()); calculationResult.setTotalTime(time); calculationResult.setAverageTime(time / routes.size()); //m/sec calculationResult.setAverageSpeed(distance * MILLIS_IN_SECOND / time); calculationResult.setMaxDistance(maxDistance); calculationResult.setMaxTime(maxTime); calculationResult.setMaxSpeed(maxSpeed); } return calculationResult; } Пример подготовки входных данных для расчета, передачи их в калькулятор, на примере класса RoutesStatisticFragment:
private StatisticsCalculationResult prepareResult(List<RouteEntity> routes) { StatisticsCalculationResult result = StatisticsCalculator.calculateStatistics(routes); return result; }
List<RouteEntity> routes = loadRoutes(position); StatisticsCalculationResult result = prepareResult(routes);
private List<RouteEntity> loadRoutes(int position) { List<RouteEntity> routes; final Bundle arguments = getArguments(); final ArrayList<Date> dates = arguments == null? null: (ArrayList<Date>) arguments.getSerializable("dates"); try { if (dates!= null) { //грузим по датам иначе берем все routes = new ArrayList<>(); for (Date date: dates) { Calendar begin = Calendar.getInstance(); begin.setTime(date); begin.set(Calendar.HOUR, 0); begin.set(Calendar.MINUTE, 0); begin.set(Calendar.SECOND, 0); // Calendar end = Calendar.getInstance(); end.setTime(date); end.set(Calendar.HOUR, 23); end.set(Calendar.MINUTE, 59); end.set(Calendar.SECOND, 59);
Where<RouteEntity, Integer> where = velocityDatabaseHelper.getSimpleRouteEntityDao().queryBuilder().where() .ge("dateStart", begin.getTime()).and().le("dateStart", end.getTime()) .and() .ge("dateFinish", begin.getTime()).and().le("dateFinish", end.getTime()); if (position!= 0) { where = where .and() .eq("routeType", RouteType.values()[position - 1]); } final List<RouteEntity> routesByDay = where.query(); routes.addAll(routesByDay); } } else { Where<RouteEntity, Integer> where = velocityDatabaseHelper .getSimpleRouteEntityDao() .queryBuilder() .where(); where = where .eq("template", false); if (position!= 0) { where = where .and() .eq("routeType", RouteType.values()[position - 1]); } routes = where .query(); } } catch (SQLException sqlEx) { throw new RuntimeException(sqlEx.getMessage(), sqlEx); } return routes; } Как видно в примере, громоздкий запрос с кучей условий остался в классе, в котором он необходим(не только для статистики), а калькулятор сделал свою работу, не зная лишних подробностей. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |