2017-10-09 2 views
0

J'ai un ArrayList() qui stocke certaines données générées en temps réel. Je veux obtenir la différence de l'élément consécutif de la ArrayListdifférence de deux valeurs consécutives dans une ArrayList: Android

  1. J'ai essayé

    ArrayList<Long> difference = new ArrayList<>(); 
    difference.add(durationInMs); 
    //tried to store 
    for (int d = 0; d < difference.size()-1; d++){ 
         time1 = difference.get(d); 
         time2 = difference.get(d + 1); 
         timeDifference = time2 - time1; 
    } 
    
  2. Ce:

    ----------------
    ArrayList<Long> difference = new ArrayList<>(); 
    difference.add(durationInMs); 
    
    ArrayList<Long> tempArray = new ArrayList<>(); 
    tempArray.add(0, difference.get(0)); 
    
    for (int d = 0; d < difference.size()-1; d++){ 
         timeDifference = tempArray.get(d+1) - difference.get(d); 
    } 
    Log.d("time", String.valueOf(timeDifference)); 
    
  3. De plus, cette enter link description here

Mais aucun d'entre eux ne semble m'obtenir la valeur soustraite entre 2 éléments consécutifs. Probablement le problème est que les valeurs sont générées en temps réel et que lors de la soustraction, la valeur suivante n'est pas encore générée. Comment est-ce que je fais?

UPDATE: la méthode (si elle contribue)

@Override 
public void onPreviewFrame(long startTime, int ySum, int uSum, int vSum, long endTime) { 
    begin = startTime; 
    img_Y_Avg = ySum; 
    img_U_Avg = uSum; 
    img_V_Avg = vSum; 
    end = endTime; 


    //set value of Y on the text view 
    TextView valueOfY = (TextView)findViewById(R.id.valueY); 
    //valueY = img_Y_Avg; 
    valueOfY.setText(Double.toString(img_Y_Avg)); 

    //set value of U on the text view 
    TextView valueOfU = (TextView)findViewById(R.id.valueU); 
    // valueU = img_U_Avg; 
    valueOfU.setText(Double.toString(img_U_Avg)); 

    //set value of V on the text view 
    TextView valueOfV = (TextView)findViewById(R.id.valueV); 
    //valueV = img_V_Avg; 
    valueOfV.setText(Double.toString(img_V_Avg)); 

    //start time in milliseconds 
    long StartDurationInMs = TimeUnit.MILLISECONDS.convert(begin, TimeUnit.MILLISECONDS); 
    ArrayList<Long> startOfTime = new ArrayList<>(); 
    startOfTime.add(StartDurationInMs); 
    Log.d("time", "start: "+String.valueOf(startOfTime)); 

    //store value to array list 
    ArrayList<Integer> yAverage = new ArrayList<>(); 
    yAverage.add(img_Y_Avg); 
    //Log.d("MyEntryData", String.valueOf(yAverage)); 

    //store u values to array 
    ArrayList<Integer> uAverage = new ArrayList<>(); 
    uAverage.add(img_U_Avg); 
    //Log.d("MyEntryData", String.valueOf(uAverage)); 

    //store u values to array 
    ArrayList<Integer> vAverage = new ArrayList<>(); 
    vAverage.add(img_V_Avg); 
    //Log.d("MyEntryData", String.valueOf(vAverage)); 
    //time between frames 

    //end time in milliseconds 
    long EndDurationInMs = TimeUnit.MILLISECONDS.convert(end, TimeUnit.MILLISECONDS); 
    ArrayList<Long> endOfTime = new ArrayList<>(); 
    endOfTime.add(EndDurationInMs); 


    Log.d("time", "end: "+String.valueOf(endOfTime)); 


    ArrayList<Long> getValues = new ArrayList<>(); 
    for(int i = 0; i < yAverage.size(); i++) { 
     getValues.add(startOfTime.get(i)); 
     getValues.add((long)(yAverage.get(i))); 
     getValues.add((long)(uAverage.get(i))); 
     getValues.add((long)(vAverage.get(i))); 
    } 


    String filename = new SimpleDateFormat("yyyyMMddHHmm'.csv'").format(new Date()); 

    File directoryDownload = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
    File logDir = new File (directoryDownload, "bpReader"); //Creates a new folder in DOWNLOAD directory 
    logDir.mkdirs(); 
    File file = new File(logDir, filename); 

    FileOutputStream outputStream = null; 
    try { 
      outputStream = new FileOutputStream(file, true); 
      //outputStream = openFileOutput(filename, Context.MODE_PRIVATE); 
      for (int i = 0; i < yAverage.size(); i += 4) { 
       outputStream.write((getValues.get(i) + ",").getBytes()); 
       outputStream.write((getValues.get(i + 1) + ",").getBytes()); 
       outputStream.write((getValues.get(i + 2) + ",").getBytes()); 
       outputStream.write((getValues.get(i + 3) + "\n").getBytes()); 

      } 
      outputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    Log.d("MyEntryData", String.valueOf(getValues)); 


    handler = new Handler(); 
    final Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      readingRemaining = readingRemaining -1; 

      if (readingRemaining > 0){ 
       plotGraph(img_Y_Avg); 
      } 
     } 
    }; 

    handler.postDelayed(runnable, 100); 

    //Log.d("MyEntryData", String.valueOf(img_Y_Avg +" "+ img_U_Avg+" "+img_V_Avg)); 

} 

Répondre

0

Essayer de temps delta = difference.get (d + 1) - difference.get (d);

ArrayList<Long> difference = new ArrayList<>(); 
    for (int i = 0; i<10; i++) 
     difference.add((long)(Math.random() * 1000)); 
    for (int d = 0; d < difference.size()-1; d++){ 
     Log.i("diff", String.format(
       "element %d,%d:%d - %d = %d", 
       d+1, d, difference.get(d+1), difference.get(d), 
       difference.get(d+1) - difference.get(d))); 
    } 
    Log.i(TAG, "hello"); 

Sortie:

... I/diff: element 1,0:197 - 425 = -228 
... I/diff: element 2,1:389 - 197 = 192 
... I/diff: element 3,2:947 - 389 = 558 
... I/diff: element 4,3:510 - 947 = -437 
... I/diff: element 5,4:399 - 510 = -111 
... I/diff: element 6,5:971 - 399 = 572 
... I/diff: element 7,6:537 - 971 = -434 
... I/diff: element 8,7:326 - 537 = -211 
... I/diff: element 9,8:897 - 326 = 571 
+0

rien ne montre dans logcat. probablement parce que ne peut pas appeler une fonction de journal à l'intérieur d'une boucle for. cela m'est arrivé plusieurs fois plus tôt. – Mill3r

+0

@ Mill3r, depuis quand ne pouvez-vous imprimer Connectez-vous dans une boucle. C'est nouveau pour moi et cela fonctionne avec le code d'exemple. –

+0

Je suis désolé peut-être que je me trompe. J'ai trouvé le vrai problème dans mon cas. Comme j'obtiens en temps réel les données de traitement d'image de 'onPrevieFrame', il n'envoie qu'un jeu de données à chaque fois pour chaque image. Je me suis déconnecté du 'yAverage.size()' et j'ai trouvé que la taille reste toujours 1. elle n'augmente pas. Par conséquent, lorsque j'essaie de trouver la différence entre les index «i» et «i + 1» dans la boucle, je reçois une erreur, car il n'y a pas de «i + 1» pour commencer. je vous remercie pour votre aide .. – Mill3r

0

Si vous craignez que le tableau est en cours de modification en temps réel que vous êtes en train de traiter, puis

Suggestion 1

Au Au moment où un nouveau point de données est généré, pourriez-vous regarder le point de données précédent et calculer delta à la volée, puis ajouter() le delta à un autre tableau?

long lastDatum = null; 
    ArrayList<long> diffArray = new ArrayList<>(); 

    void recordDataPoint(long datum) 
    { 
     if (lastDatum != null) { 
     diffArray.add(datum - lastDatum); 
     } 
     lastDatum = datum; 

     // ... do whatever else you need to do with datum.... 
    } 

Suggestion 2
Si le tableau est stable alors je pense que vous avez juste besoin de faire ceci:

// existing data is in durationInMs[] 

    ArrayList<Long> difference = new ArrayList<>(); 

    for (int d = 0; d < durationInMs.size()-1; d++){ 
     time1 = durationInMs.get(d); 
     time2 = durationInMs.get(d + 1); 
     timeDifference = time2 - time1; 

     difference.add(timeDifference); 
} 
+0

Je n'ai pas vraiment compris ce que vous essayez de faire. J'ai eu le concept ce que vous essayez de dire, mais le code que vous avez écrit .... est-ce que vous créez une autre méthode ou quelque chose comme ça pour faire les calculs? – Mill3r

+0

Désolé si ce n'est pas clair. Vous avez mentionné que vous sauvegardez des données en temps réel dans un tableau.Je suggère que l'enregistrement (temps1-temps2), en temps réel, d'un nouveau tableau de différences pourrait vous aider, plutôt que de le post-traiter. – Mike

+0

'ArrayList difference = new ArrayList <>(); difference.add (durationInMs); ArrayList tempArray = new ArrayList <>(); tempArray.add (0, différence.get (0)); pour (int d = 1; d Mill3r