2017-10-09 2 views
0

私はArrayList()にリアルタイムで生成されたいくつかのデータを保存しています。 ----------------ArrayList内の2つの連続する値の違い:Android

:私は、私はこの

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; 
} 
  • これを試してみましたArrayList

    1. の連続した要素の違いを取得したいですまた

      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)); 
      
    2. この enter link description here

    しかし、それらのうちの2つの連続した要素の間で減算された値が得られないようです。おそらく問題は、リアルタイムで値が生成されていることです。これを減算すると、次の値はまだ生成されていません。 どうすればいいですか?

    UPDATE:方法(それが役立つ場合)

    @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)); 
    
    } 
    
  • 答えて

    0

    長いデルタ= 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"); 
    

    出力:

    ... 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

    何もlogcatに示していません。おそらくforループ内のログ関数を呼び出すことができないからです。それは数回前に私に起こった。 – Mill3r

    +0

    @ Mill3r、いつループ内でログを印刷できないのですか?これは私には新しく、サンプルコードで動作します。 –

    +0

    申し訳ありませんが私は間違っているかもしれません。 私の場合、本当の問題が見つかりました。私はリアルタイムで 'onPrevieFrame'から画像処理データを取得しているので、毎回フレームごとに1セットのデータを送信します。私は 'yAverage.size()'をログアウトし、サイズが常に1のままであることを発見しました。したがって、ループ内でインデックスiとi + 1の差を見つけようとすると、最初にi + 1が存在しないため、エラーが発生します。 助けてくれてありがとう。 – Mill3r

    0

    あなたがそれを処理しているように、アレイは、で、その後

    提案1

    をリアルタイムに変更されていることを懸念している場合新しいデータポイントが生成される時には、以前のデータポイントを見てデルタをオンザフライで計算し、デルタを別の配列に追加できますか?

    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.... 
        } 
    

    提言2
    配列が安定しているなら、私はあなただけでこれを実行する必要があると思う:

    // 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

    私はあなたがしたいことを実際に理解していませんでした。私はあなたの言うことを考えているが、あなたが書いたコードをコンセプトにしています.... 計算を行うために別の方法などを作成していますか? – Mill3r

    +0

    申し訳ありませんが明らかでない場合。あなたは、リアルタイムでデータを配列に保存することに言及しました。おそらく、(time1-time2)のリアルタイムの差分を新しい配列に保存することをお勧めします。後処理ではなく、役立ちます。 – Mike

    +0

    'ArrayList 違い=新しいArrayList <>(); difference.add(durationInMs); ArrayList tempArray = new ArrayList <>(); tempArray.add(0、difference.get(0)); for(int d = 1; d Mill3r

    関連する問題