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