0

Я получаю маршруты, включая путевые точки из API проезжей части в своем приложении для Android. Он содержит несколько сегментов «ноги», которые имеют собственное расстояние и продолжительность. Есть ли способ суммировать все расстояния и длительности, чтобы получить общие значения?Общие сведения о маршрутах API общее расстояние и продолжительность с путевыми точками

Пример: Лишенный JSON сегмент от Направление API

legs": [ 
{ 
    "distance": { 
    "text": "389 km", 
    "value": 389438 
    }, 
    "duration": { 
    "text": "6 hours 31 mins", 
    "value": 23452 
    } 
}, 
{ 
    "distance": { 
    "text": "0.5 km", 
    "value": 487 
    }, 
    "duration": { 
    "text": "2 mins", 
    "value": 102 
    } 
} 
] 

из приведенной выше реакции, есть способ, чтобы вычислить и показать выход, как следующее:

Общее расстояние: 389,5 км Всего продолжительность: 6 часов 33 минуты

+1

Да, вы анализируете ответ, получаете каждый элемент и плюс их. У вас возникли проблемы с этим? – Yurets

+0

@ Юреты хорошо, я мог бы сделать расстояние, но как я могу суммировать продолжительность, так как это могут быть разные форматы? ex minutes, hours, days и представлен как текст, читаемый человеком? помочь дать образец? –

ответ

1

В дополнение к моим комментариям и ответам @Kushal вот как можно вычислить общее время. Я пропустил путь, чтобы получить JSONObject, потому что он уже описан и дает пример с данными String[], которые вы получаете при разборе JSON. В этом примере я сделал все из возможных сценариев с данным ответом, так что вы можете использовать его без изменения:

String[] timeItems = {"4 days 1 hour 12 mins", "5 hours 9 mins"}; // as example for visibility 
    int[] total = {0, 0, 0}; // days, hours, minutes 
    for(int i = 0; i < timeItems.length; i++){ 
     if(timeItems[i].contains("day ")){ 
      total[0]++; 
     }else if(timeItems[i].contains("days")){ 
      total[0] += Integer.valueOf(timeItems[i].substring(0, timeItems[i].indexOf(" days"))); 
     } 
     if(timeItems[i].contains("hour ")){ 
      total[1]++; 
     }else if(timeItems[i].contains("hours")){ 
      if(timeItems[i].indexOf(" hours") <= 3){ 
       total[1] += Integer.valueOf(timeItems[i].substring(0, timeItems[i].indexOf(" hours"))); 
      }else{ 
       if(timeItems[i].contains("days")){ 
        total[1] += Integer.valueOf(timeItems[i].substring(timeItems[i].lastIndexOf("days ")) + 5, timeItems[i].indexOf(" hours")); 
       }else{ 
        total[1] += Integer.valueOf(timeItems[i].substring(timeItems[i].lastIndexOf("day ")) + 4, timeItems[i].indexOf(" hours")); 
       } 
      } 
     } 
     if(timeItems[i].contains("min ")){ 
      total[2]++; 
     }else if(timeItems[i].contains("mins")){ 
      if(timeItems[i].indexOf(" mins") <= 3){ 
       total[2] += Integer.valueOf(timeItems[i].substring(0, timeItems[i].indexOf(" mins"))); 
      }else{ 
       if(timeItems[i].contains("hours")){ 
        total[2] += Integer.valueOf(timeItems[i].substring(timeItems[i].indexOf("hours ") + 6, timeItems[i].indexOf(" mins"))); 
       }else{ 
        total[2] += Integer.valueOf(timeItems[i].substring(timeItems[i].indexOf("hour ") + 5, timeItems[i].indexOf(" mins"))); 
       } 
      } 
     } 
    } 
    Log.d("LOG", total[0] + " days " + total[1] + " hours " + total[2] + " mins."); 

В этом должен быть немного более сложным, чем я думал, что, может быть, можно упростить как-то или использовать аналогичные идеи, но главное - показать вам рабочий пример. Я отлаживал этот код. Он дает правильный результат:

05-19 23:00:38.687 14251-14251/whatever.com.myapplication D/LOG﹕ 4 days 6 hours 21 mins. 

Надеюсь, это поможет. Сообщите мне, подходит ли оно вам или нет.

+1

Это то, что я искал. Большое спасибо. Я обязательно попробую это и дам вам знать, как это происходит. Ура! –

+1

Хорошо, будет ждать, счастливое кодирование :) – Yurets

+0

В коде была проблема, и я смог ее исправить. Скажите, если поездка занимает ровно 1 час или 1 минуту или 1 день, оператор if для проверки одного дня/часа/мин не будет выполнен, потому что не будет конечных пробелов. Например, это будет «1 минута», а не «1 минута». Я просто удалил конечное пространство из инструкции if-else и отменил порядок, чтобы он сначала проверял множественные числа, а затем исключил, и он отлично работает. –

1

Этот метод будет рассчитать расстояние от всей арматуры:

public void parseJson(String json) { 

    JSONObject jsonObj = new JSONObject(json); 
    JSONObject object = (JSONObject) new JSONTokener(json).nextValue(); 

    JSONObject legsJson = object.getJSONObject("legs"); 
    long dist = 0; 
    for(int i = 0; i < legsJson.size(); i++) { 
     // dist in meter 
     dist = dist + jsonObj[i].getJSONArray("distance").getString("value"); 
    } 

    // convert to killo meter 
    float frac = dist % 1000; 
    dist = dist/1000 ; 
    dist = dist + frac; 
    Log.w("distance","Calculated distance :"+dist); 
} 
+0

как насчет продолжительности? – gaurang

2

Это добавляет длительность ответа на Kushal в:

public void parseJson(String json) { 

    JSONObject jsonObj = new JSONObject(json); 
    JSONObject object = (JSONObject) new JSONTokener(json).nextValue(); 

    JSONObject legsJson = object.getJSONObject("legs"); 
    long totalDistance = 0; 
    int totalSeconds = 0; 
    for(int i = 0; i < legsJson.size(); i++) { 
     // distance in meter 
     totalDistance = totalDistance + Long.parseLong(jsonObj[i].getJSONArray("distance").getString("value")); 
     totalSeconds = totalSeconds + Integer.parseInt(jsonObj[i].getJSONArray("duration").getString("value")); 
    } 

    // convert to kilometer 
    double dist = dist/1000.0 ; 
    Log.d("distance", "Calculated distance:" + dist); 

    int days = totalSeconds/86400 
    int hours = (totalSeconds - days * 86400)/3600; 
    int minutes = (totalSeconds - days * 86400 - hours * 3600)/60; 
    int seconds = totalSeconds - days * 86400 - hours * 3600 - minutes * 60; 
    Log.d("duration", days + " days " + hours + " hours " + minutes + " mins" + seconds + " seconds"); 
} 
0

Расстояние Метод расчета. Надеюсь, что это поможет кому-нибудь.

private String distanceCalculation(String[] distanceItems) { 
    //String[] totalDis = {"50 km", "4.5 km"}; // as example for visibility 
    String totalDis = ""; 
    float distance = 0; 
    String[] splitArray; 
    if (distanceItems.length > 1) { 
     for (String distanceItem : distanceItems) { 
      splitArray = distanceItem.split(" "); 
      Log.e("distance List", splitArray[0]); 
      distance = distance + Float.valueOf(splitArray[0]); 
     } 
     DecimalFormat decimalFormat = new DecimalFormat("#.##"); 
     float twoDigitsF = Float.valueOf(decimalFormat.format(distance)); 
     totalDis = String.valueOf(twoDigitsF) + " km"; 
     Log.e("Total km ", totalDis); 
    } else { 
     totalDis = distanceItems[0]; 
    } 
    return totalDis; 
}