我现在数据拟合是在后台来做的。总共有5个类,有5个泛型List,需要合并重新封装成一个泛型List第一个类 Aprivate int id;
private java.sql.Date time;
private int value;
第一个类 Bprivate int id;
private java.sql.Date time;
private int value;
第一个类 Cprivate int id;
private java.sql.Date time;
private int value;第一个类 Dprivate int id;
private java.sql.Date time;
private int value;第一个类 Eprivate int id;
private java.sql.Date time;
private int value;这样的5个类要重新封装到nodeinfo这类中private int id;
private java.sql.Date time;
private int aValue;
private int bValue;
private int cValue;
private int dValue;
private int eValue;在封装的时候需要几点主意 (数据来自数据库,时间精度到秒,15秒一条)
第一:把时间相近的数据拟合成一条nodeinfo之后放到List中
第二:A类时间是从3月4号开始有数据,其余的是从3月9号开始有数据
这是也要进行合并,bValue,cValue,dValue,eValue都是空值,
到了3月9号开始有值。
第三:发现D类,中间3月11号数据正好没有其他正常,这是nodeinfo要空值,过了今天之后的有数据在进行拟合进去。5个类都有时间,但是呢最后的nodeinfo只要一个时间。
这样的时候要怎么拟合啊大家帮帮我、。
private java.sql.Date time;
private int value;
第一个类 Bprivate int id;
private java.sql.Date time;
private int value;
第一个类 Cprivate int id;
private java.sql.Date time;
private int value;第一个类 Dprivate int id;
private java.sql.Date time;
private int value;第一个类 Eprivate int id;
private java.sql.Date time;
private int value;这样的5个类要重新封装到nodeinfo这类中private int id;
private java.sql.Date time;
private int aValue;
private int bValue;
private int cValue;
private int dValue;
private int eValue;在封装的时候需要几点主意 (数据来自数据库,时间精度到秒,15秒一条)
第一:把时间相近的数据拟合成一条nodeinfo之后放到List中
第二:A类时间是从3月4号开始有数据,其余的是从3月9号开始有数据
这是也要进行合并,bValue,cValue,dValue,eValue都是空值,
到了3月9号开始有值。
第三:发现D类,中间3月11号数据正好没有其他正常,这是nodeinfo要空值,过了今天之后的有数据在进行拟合进去。5个类都有时间,但是呢最后的nodeinfo只要一个时间。
这样的时候要怎么拟合啊大家帮帮我、。
数据是这样的就是不完整吧不完整的数据拟合,因为ABCDE都有时间,时间误差越小越好。没有的数据就给它空值。
public class Conclude5in1 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<A> aList = new ArrayList<A>();
List<B> bList = new ArrayList<B>();
List<C> cList = new ArrayList<C>();
List<D> dList = new ArrayList<D>();
List<E> eList = new ArrayList<E>();
/* 以上代码保证编译时没有语法异常 */
List<NodeInfo> nodeList = new ArrayList<NodeInfo>();
final long timeInterval = 15*1000;
/*为简化程序代码,将相关数据做成数组形式*/
final List<DataSource> lists[] = new List[]{aList,bList,cList,dList,eList};
int indexs[] = new int[]{0,0,0,0,0};
/* 若五组数据已经按时间先后排序,那么下面这步省略 */
for(List<DataSource> list:lists){
sort(list);
}
while(indexs[0]<lists[0].size() || indexs[1]<lists[1].size()
||indexs[2]<lists[2].size() || indexs[3]<lists[3].size()
||indexs[4]<lists[4].size()){
/*找到五组数据的当前数据中时间在最前面的那个元素的时间*/
java.sql.Date minTime = lists[0].get(indexs[0]).getTime();
for(int i=1;i<5;i++){
if(minTime.compareTo(lists[i].get(indexs[i]).getTime())>0)
minTime=lists[i].get(indexs[i]).getTime();
}
/* 当前数据的合并(拟合)*/
NodeInfo ni = new NodeInfo();
ni.setTime(minTime);
/*id属性我没有处理,有可能是数据库生成的主键*/
for(int i=0;i<5;i++){
if(indexs[i]<lists[i].size()
&& hasInInterval(minTime,aList.get(indexs[i]).getTime(),timeInterval)){
switch(i){
case 0:ni.setAValue(lists[i].get(indexs[i]).getValue());break;
case 1:ni.setBValue(lists[i].get(indexs[i]).getValue());break;
case 2:ni.setCValue(lists[i].get(indexs[i]).getValue());break;
case 3:ni.setDValue(lists[i].get(indexs[i]).getValue());break;
case 4:ni.setEValue(lists[i].get(indexs[i]).getValue());break;
}
indexs[i]++;
}
}
nodeList.add(ni);
}
/* nodeList 里面的内容,应该就是想要的结果。 */
/* 代码目前没有语法错误。运行是否有异常,我也没测试。
* 写这个也只是抛砖引玉,可能会给楼主某些启示。
*/
}
/**
* 判断两个时间是否处于同一个时间间隔内
*/
private static boolean hasInInterval(Date std, Date time, long timeInterval) {
return std.getTime()+timeInterval<=time.getTime();
} private static void sort(List<? extends DataSource> list) {
Collections.sort(list, new Comparator<DataSource>(){
public int compare(DataSource o1, DataSource o2) {
return o1.getTime().compareTo(o2.getTime());
}
});
} /* 以下代码保证编译时没有语法异常 */
static class A extends DataSource{}
static class B extends DataSource{}
static class C extends DataSource{}
static class D extends DataSource{}
static class E extends DataSource{}
static class DataSource {
private int id;
private java.sql.Date time;
private int value;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public java.sql.Date getTime() {
return time;
}
public void setTime(java.sql.Date time) {
this.time = time;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
static class NodeInfo{
private int id;
private java.sql.Date time;
private int aValue;
private int bValue;
private int cValue;
private int dValue;
private int eValue;
public int getAValue() {
return aValue;
}
public void setAValue(int value) {
aValue = value;
}
public int getBValue() {
return bValue;
}
public void setBValue(int value) {
bValue = value;
}
public int getCValue() {
return cValue;
}
public void setCValue(int value) {
cValue = value;
}
public int getDValue() {
return dValue;
}
public void setDValue(int value) {
dValue = value;
}
public int getEValue() {
return eValue;
}
public void setEValue(int value) {
eValue = value;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public java.sql.Date getTime() {
return time;
}
public void setTime(java.sql.Date time) {
this.time = time;
}
}
}
因为上班没仔细看,如有误解请原谅。
还有,
/**
* 判断两个时间是否处于同一个时间间隔内
*/
private static boolean hasInInterval(Date std, Date time, long timeInterval) {
return std.getTime()+timeInterval<=time.getTime();
}这个方法,可能有些错误。我是想实现注释当中的功能,但实际上没有。
可以尝试把方法体作如下修改:
return time.getTime>=std.getTime() && time.getTime()<std.getTime()+timeInterval;
开始a有数据,而没有bcde的数据在时间间隔内,所以,他们对应的value都为0;
如果8~9的时候,bcde在同一时间间隔内有数据,而a没有,那么aValue的值为0。
无论那种情况,time的值都是abcde中存在并且最靠前的时间点。