一、问题分析
1、上面可转化为如下:
avg0=sum(L0)/count(L0);
avg1=(sum(L1)/count(L1)+avg0)/2;
avg2=(sum(L2)/count(L2)+avg1)/2;
。
。
。
avg7=(sum(L7)/count(L7)+avg6)/2;
2、因为每一天的指标都需要前一天的指标内容,所以当某天数据变化时需要将其检测出来。如果Day2和Day5同时变化,那么显示结果是2和5
二、步骤分析
1、将认为正确的指标加入到一个集合中,以后产生新的指标集均与此比对,挑选出变化的日期;
2、若认为新指标集正确,那么将其设为标准指标集,以后变化的指标均与其比对。
三、代码实现
package cn.learn;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class SignTest {
int[] d0={5,4,15,4,16};
int[] d0_1={34,52,0,8,16};
int[] d1={1,24,5,44,26};
int[] d1_1={44,3,84,9,26};
int[] d2={25,13,31,5,36};
int[] d2_1={2445,0,432,5,36};
int[] d3={43,1,18,42,3};
int[] d3_1={3,434,997,42,3};
int[] d4={31,3,5,32,55};
int[] d4_1={0,0,1,1,1};
int[] d5={3,64,4,43,16};
int[] d5_1={1,0,1,2,8};
int[] d6={43,3,93,5,78};
int[] d6_1={34223,443,3,9,7348};
int[] d7={0,43,84,32,6};
int[] d7_1={873,90,8344,38782,34};
//每天的数据集
List firstDataList=new ArrayList();
//每天的数据集
List changeDataList=new ArrayList();
//指标数据结果集合
List signDataList=new ArrayList();
//变化的日期列表
List changeDayList=new ArrayList();
@Test
public void test1() throws Exception{
//操作完了后firstDataList里面会有每天的数据
getFristDataList();
//操作完了signDataList里会有指标集合
getSignList(firstDataList,firstDataList.size());
//将正确的指标用IO流加入到文件中
sendRightSign(signDataList);
System.out.println("正确的指标是:"+getRightSign());
}
@Test
public void test2() throws Exception{
//操作完了后firstDataList里面会有每天的数据
getFristDataList();
//操作后changeDataList里会有变化后的每天数据
getChangeDataList();
//操作完了signDataList里会有指标集合
getSignList(changeDataList,changeDataList.size());
System.out.println("正确的指标是:"+getRightSign());
System.out.println("变化后指标是:"+signDataList);
//执行后changeDayList里面存放的是变化的日期
findDifferentDay(getRightSign(),signDataList);
System.out.println("第"+changeDayList+"天的数据变了");
}
//将认为正确的指标加入到文件中
public void sendRightSign(List list) throws Exception{
BufferedWriter bf=new BufferedWriter(new FileWriter("D:\\Sign\\sign.txt"));
bf.write(list.toString());
bf.write("\r\n");
bf.flush();
}
//使用io流从文件中读取正确的指标
public List getRightSign() throws Exception{
List list=new ArrayList();
BufferedReader br=new BufferedReader(new FileReader("D:\\Sign\\sign.txt"));
String strList=br.readLine();
String[] array=strList.split(",");
for(int i=0;i<array.length;i++) {
if(i==0) {
list.add(Integer.parseInt(array[i].trim().substring(1)));
}else if(i==array.length-1) {
list.add(Integer.parseInt(array[i].trim().substring(0,array[i].trim().toCharArray().length-1)));
}else {
list.add(Integer.parseInt(array[i].trim()));
}
}
return list;
}
public List getFristDataList() {
firstDataList.add(d0);
firstDataList.add(d1);
firstDataList.add(d2);
firstDataList.add(d3);
firstDataList.add(d4);
firstDataList.add(d5);
firstDataList.add(d6);
firstDataList.add(d7);
return firstDataList;
}
public List getChangeDataList(){
changeDataList.add(d0);
changeDataList.add(d1);
changeDataList.add(d2_1);
changeDataList.add(d3);
changeDataList.add(d4);
changeDataList.add(d5);
changeDataList.add(d6_1);
changeDataList.add(d7);
return changeDataList;
}
public int getSign(int[] intArray) {
int sum=0;
for(int i:intArray) {
sum+=i;
}
return sum/intArray.length;
}
public int getSignList(List<int[]> tempDataList,int i) {
if(tempDataList.size()==0)
return -1;
if(i==1) {
signDataList.add(getSign(tempDataList.get(0)));
return getSign(tempDataList.get(0));
}else {
int j=(getSign(tempDataList.get(--i))+getSignList(tempDataList,i))/2;
signDataList.add(j);
return j;
}
}
int flag=0;
@SuppressWarnings("unchecked")
public int findDifferentDay(List l1,List l2) {
//比较两个指标的不同,需要逐位比对
//[4,25,6,33]
//[4,64,9,40]
if(l1.size()>0&&l2.size()>0) {
System.out.println("*******开始比对啦************");
if(l1.get(0).equals(l2.get(0))) {
l1.remove(0);
l2.remove(0);
flag++;
return findDifferentDay(l1,l2);
}else {
//如果第1位不相等,就把flag加入到变化的队列里,然后把这天的数据取出来和上面的数据重新做指标集,再去比对
changeDayList.add(flag);
//准备数据集
firstDataList.set(flag, changeDataList.get(flag));
signDataList=new ArrayList();
getSignList(firstDataList,firstDataList.size());
//上面操作完后会产生新的指标,长度必须截掉
for(int i=0;i<=flag;i++) {
signDataList.remove(0);
}
l2.remove(0);
flag++;
return findDifferentDay(signDataList,l2);
}
}else {
return -1;
}
}
}
1、先执行test01方法再执行test02方法;
2、因为没连接数据库,所以正确指标使用IO流存在到sign.txt文件中了;
3、在getChangeDataList方法中修改数据集。