АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Расчет статистики по группе маршрутов

Читайте также:
  1. I. Расчет параметров железнодорожного транспорта
  2. I.2. Определение расчетной длины и расчетной нагрузки на колонну
  3. II раздел. Расчет эффективности производственно-финансовой деятельности
  4. II. Расчет параметров автомобильного транспорта.
  5. III. Расчет параметров конвейерного транспорта.
  6. А президент Мубарак уперся. И уходить не захотел. Хотя расчет США был на обычную реакцию свергаемого главы государства. Восьмидесятидвухлетний старик оказался упрямым.
  7. А. Аналитический способ расчета.
  8. Активити списка маршрутов
  9. Алгоритм проверки адекватности множественной регрессионной модели (сущность этапов проверки, расчетные формулы, формулировка вывода).
  10. Алгоритм проверки значимости регрессоров во множественной регрессионной модели: выдвигаемая статистическая гипотеза, процедура ее проверки, формулы для расчета статистики.
  11. Анизотропия. Выявление анизотропии свойств геологических переменных методами геостатистики.
  12. АУДИТ ОПЕРАЦИЙ ПО РАСЧЕТНЫМ СЧЕТАМ

Основной логической единицей представления данных является маршрут. Характеристики маршрута формируются в процессе записи(расстояние, время, географическое положение), некоторые могут задаваться позже или редактироваться(название, тип). Маршруты состоят из точек, представляя из себя набор данных о положении в пространстве(широта, долгота, высота над уровнем моря), времени, скорости и ускорении, точка дает полезную информацию только в совокупности с другими такими же точками. Их упорядоченное множество и составляет маршрут.

При выборке данных за разные маршруты(это может быть группа маршрутов за определенный период или выбранных в зависимости от их типа) необходимо произвести пересчет данных(общее время расстояние, средние и максимальные значения скорости, продолжительности и пройденного расстояния за один маршрут) и перевести в формат, удобный для отображения. Задача калькулятора - считать, формирование данных для расчета задача обращающегося к расчету компонента. Сделав максимально простой метод расчета, удалось удачно разделить непосредственный расчет и формирование данных(в калькулятор передаются сами маршруты, никаких обращений к базе или внешним данным):

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;

}

Как видно в примере, громоздкий запрос с кучей условий остался в классе, в котором он необходим(не только для статистики), а калькулятор сделал свою работу, не зная лишних подробностей.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.006 сек.)