递归方法检测指标嵌套问题

在这里插入图片描述

一、问题分析

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方法中修改数据集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值