Java Arraylist中使用的重复数据

Java Arraylist中使用的重复数据,java,arrays,duplicates,Java,Arrays,Duplicates,下面的代码如何处理数据是我遇到的一个问题。输入的数据是从一个主类处理的,保存在arraylist中并处理到这个类。然后对数据进行筛选,以获得阵列各部分中的必要信息,以进行平均 输入的数据输入到代码中的频率是10hz,因此我预计200个输入值为20秒(ish)。然而,我得到的是每秒200个输入的几个输出,这让我认为是代码本身复制或滴答过快,而不是等待下一个输入。我试图通过SF来寻找阻止复制的帮助,但似乎找不到任何帮助 我已经尝试实现了一个计时器,看看这是否会抵消这个问题,但它并不能解决这个问题,而

下面的代码如何处理数据是我遇到的一个问题。输入的数据是从一个主类处理的,保存在arraylist中并处理到这个类。然后对数据进行筛选,以获得阵列各部分中的必要信息,以进行平均

输入的数据输入到代码中的频率是10hz,因此我预计200个输入值为20秒(ish)。然而,我得到的是每秒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;
    } 
}
package-TCPRequester;
导入java.util.*;
公共类数组{
私人浮动价=0.0f;
私人浮动前价格数据=0.0f;
int totalBuffer=0;
int timerClicker=0;
浮动价um=0f;
浮点数=0f;
私有静态最终int FACEID_索引=6;
私有静态最终整数价指数=17;
ArrayList Valencarray;
公共数组()
{
//float和name需要位于public方法之上
ValentArray=新的ArrayList();
}
//改为如果
公共无效ValentArray(字符串[]inArray)
{
做{
if(inArray[FACEID_INDEX].equals(“1”)){
//这需要是一个可重复的过程
价=浮点数.parseFloat(inArray[价指数]);
//将价值放入数组列表中
加上(价);
//为该缓冲区中的每个输入添加1次单击
totalBuffer++;
timerClicker++;
}否则{
timerClicker++;
}

}而(timerClicker一个选项是增加计数延迟,以调整必要的数据到达频率(根据您的话,这是每1秒10条记录)。但是请注意,如果频率超过10Hz,此方法将丢失到达的数据,如果频率低于10Hz,则将放置重复数据

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  
}  
public void valencarray(字符串[]inArray)引发中断异常
{
做{
if(inArray[FACEID_INDEX].equals(“1”)){
//这需要是一个可重复的过程
价=浮点数.parseFloat(inArray[价指数]);
//将价值放入数组列表中
加上(价);
//为该缓冲区中的每个输入添加1次单击
totalBuffer++;
timerClicker++;
}否则{
timerClicker++;
}
睡眠(100);

}而(timerClicker在接受了@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 {
        } 
}
package-TCPRequester;
导入java.util.*;
公共类数组
{
私人浮动价=0.0f;
私人浮动前价格数据=0.0f;
私有静态int totalBuffer=0;
公共静态浮动价sum=0f;
专用静态浮点数总=0f;
私有静态最终int FACEID_索引=6;
私有静态最终整数价指数=17;
公共静态ArrayList Valencarray;
公共数组()
{
ValentArray=新的ArrayList();
//将计时器初始化为系统中最早的时间
}
void ValenceCalculation()引发InterruptedException
{  
//将计时器设置为10秒,然后当它通过时,执行系统
计时器mathsTimer=新计时器();
TimerTask myTask=新TimerTask()
{
公开募捐
{

对于(int i=0;iyou只是迭代200次。您如何保证每次迭代恰好每0.1秒发生一次?当然会有很多次迭代将重复项放入数组中,因为在0.1秒内会发生很多次迭代,而不仅仅是一次。您没有看到我下面的答案吗?您可以在periodi之前完成凯利将线程置于休眠状态我已对另一个线程进行了注释,以保存多流对话。@BJSF破解得很好,这完全取决于元素“inArray[VALENCE_INDEX]”的填充方式。在下一次迭代中,新引入的元素可能与上一个相同,在这种情况下,“valentarray”中当然会有重复的元素.是否希望“ValencyArray”中的所有元素都是唯一的?我建议的方法保证“ValencyArray”中插入的元素不会超过200个在20秒内。但是,这并不保证这些元素都是唯一的。如果您希望它们是唯一的,您可以使用Set检查每个传入元素的唯一性。我已经尝试了编码建议。我将尝试对多线程进行优化,因为它可以更有效地工作,但会导致线程睡眠、delay只是减慢了进程,但仍然填充相同的浮点输入,而不是提取数组中的数据,数组中的数据总是每隔。1秒更改一次,但感谢您的输入。在对进程进行更多操作后,我需要重新设置我的do while格式,以便以不同的方式工作。对不起,我的笔记本电脑行为怪异,因此,对于重复或通知,我深表歉意离子垃圾邮件。它可以是相等的,但应该是交替的,因为值确实会定期从-100变为100。当我有意改变值时,差异至少应该在一秒钟内改变。目前我将其限制为200个输入,就像数学和输入限制一样,它应该在每200个完整数组中进行18秒的输入。我的问题是数据是要改变的(a