Дублированные данные, используемые в Arraylist - PullRequest
0 голосов
/ 04 июня 2018

У меня проблема с обработкой данных с помощью приведенного ниже кода.Введенные данные обрабатываются из основного класса, хранятся в массиве и обрабатываются до этого класса.Затем данные отсеиваются для получения необходимой информации в частях массива для среднего усреднения.

Вводимые данные поступают в код с частотой 10 Гц, поэтому я должен ожидать, что 200 входных данных будут составлять 20 секунд (иш).Вместо этого я получаю несколько выходов по 200 входов в секунду, что заставляет меня думать, что сам код дублирует или тикает слишком быстро, вместо того, чтобы ждать следующего ввода.Я пытался найти помощь в прекращении дублирования через SF, но, похоже, не смог найти ни одного.

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

Спасибо

package TCPRequester;

import java.util.*;

public class AffdexArray {

private float valence = 0.0f;
private float previousValenceData = 0.0f;

int totalBuffer = 0;
int timerClicker = 0;
float valenceSum = 0f;
float valenceTotal = 0f;

private static final int FACEID_INDEX = 6;
private static final int VALENCE_INDEX = 17;   
ArrayList<Float> valenceArray;

public AffdexArray()
 {
    //the float and name needs to go above public method

    valenceArray = new ArrayList<Float>();

 }
    //change to if
    public void valenceArray(String[] inArray)
    {
        do{
            if(inArray[FACEID_INDEX].equals("1")){
                //this needs to be a repeatable process
                valence = Float.parseFloat(inArray[VALENCE_INDEX]);
                //places the valence value into an Array list
                valenceArray.add(valence);
                //adds 1 a click to every input into that buffer
                totalBuffer++;   
                timerClicker++;
            } else {
                timerClicker++;
            }
        } while(timerClicker <= 199);
        //timer array set up to make it go every 10 seconds.
            for(int i = 0; i<totalBuffer;i++)
                {           
                valenceSum += valenceArray.get(i);
                //add all values and divide by clicker amount. (mean?)
                }
            //after 10 seconds grab the values in buffer and clicker amount.
            valenceTotal = valenceSum / totalBuffer;
            //System.out.println("Valence Average = " + valenceTotal + "Previous Total: " + previousValenceData);      
            //Transfers float value into new variable
            previousValenceData = valenceTotal;
            //clear buffer and reset timer
            valenceArray.clear();
            totalBuffer = 0;
            timerClicker = 0;
            valenceTotal = 0;
    } 
}

Обновление - после разбивки и просмотра процесса с точками останова.
При переносе в этот класс проблема исходит из массива в цикле while do, который вызывает проблему и заполняетЯ надеялся, что массив будет заполнен 200 уникальными значениями, но вместо этого он заполняет его тем же значением, вместо этого, таким образом, 3 выводит в секунду вместо 1 каждые 20 секунд.

Есть ли процесс, который обеспечит егоуникальный ввод каждый раз, когда он проходит через do while или есть лучший способ попробовать?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Получив совет @mangusta, я вернулся и начал распределять вещи по различным потокам и работал над этой идеей.После небольшой игры и активации таймеров у меня есть расчеты для работы.

Спасибо mangusta за предложения.

package TCPRequester;

import java.util.*;

public class AffdexArray
{

private float valence = 0.0f;
private float previousValenceData = 0.0f;

private static int totalBuffer = 0;
public static float valenceSum = 0f;
private static float valenceTotal = 0f;

private static final int FACEID_INDEX = 6;
private static final int VALENCE_INDEX = 17;   
public static ArrayList<Float> valenceArray; 

public AffdexArray()
{

    valenceArray = new ArrayList<Float>();    
    //initialise the timer to the earliest time in systems

}

void ValenceCalculation() throws InterruptedException
{  
    //Set timer for ten seconds then when it has passed, do system
    Timer mathsTimer = new Timer();
    TimerTask myTask = new TimerTask()
    {
        public void run()
        {
        for(int i = 0; i<valenceArray.size();i++)
                {           
                valenceSum += valenceArray.get(i);
                //add all values and divide by clicker amount. (mean?)
                }
            //after 10 seconds grab the values in buffer and clicker amount.
            valenceTotal = valenceSum / totalBuffer;
            System.out.println("Valence Average = " + valenceTotal); 
            System.out.println("Data Count: " + valenceArray.size());;
            //Transfers float value into new variable
            //previousValenceData = valenceTotal;
            //clear buffer and reset timer
            valenceArray.clear();
            totalBuffer = 0;
            valenceSum = 0; 
        }
    };mathsTimer.schedule(myTask, 0, 5000);
}


public void valenceProcess(String[] inArray) 

{
    if(inArray[FACEID_INDEX].equals("1"))
    {
    //this needs to be a repeatable process

            valence = Float.parseFloat(inArray[VALENCE_INDEX]);
            //places the valence value into an Array list
            valenceArray.add(valence);
            //adds 1 a click to every input into that buffer
            totalBuffer++;   
            } else {
        } 
}

}

0 голосов
/ 04 июня 2018

Один из вариантов - добавить задержку к вашему счету, чтобы настроить необходимую частоту поступления данных (по вашим словам, 10 записей в 1 секунду).Однако обратите внимание, что этот метод пропускает поступающие данные, если частота больше 10 Гц, и помещает дубликаты, если частота меньше 10 Гц

public void valenceArray(String[] inArray) throws InterruptedException
{
   do{
        if(inArray[FACEID_INDEX].equals("1")){
            //this needs to be a repeatable process
            valence = Float.parseFloat(inArray[VALENCE_INDEX]);
            //places the valence value into an Array list
            valenceArray.add(valence);
            //adds 1 a click to every input into that buffer
            totalBuffer++;   
            timerClicker++;
        } else {
            timerClicker++;
        }

        Thread.sleep (100);
    } while(timerClicker <= 199);

//remaining part stays the same  
}  

Относительно оставшейся части, даже если речь идет только о поиске среднего значения.из не более 200 чисел с плавающей запятой, он может поглотить значительную часть интервала в 0,1 секунды и, следовательно, привести к пропуску входящего элемента, поэтому было бы лучше переместить эту часть наружу в отдельный поток для параллельной работы с "valenceArray"() "метод

...