我现在数据拟合是在后台来做的。总共有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只要一个时间。
这样的时候要怎么拟合啊大家帮帮我、。

解决方案 »

  1.   

    就是吧ABCDE   5个类根据时间拟合。我找到方法了不知道谁能招到更好的
      

  2.   


    数据是这样的就是不完整吧不完整的数据拟合,因为ABCDE都有时间,时间误差越小越好。没有的数据就给它空值。
      

  3.   

    我写了一个比较恶心的代码,给楼主参考一下吧。
    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;
    }
    }
    }
      

  4.   

    5楼:我看了你的代码实现应该没有问题但是数据时间上A是从3点开始有,BCDE从5点开始有,突然A到了8-9的没有了其他的BCDE都有这个时间短的数据这样的话你最后拟合出来的数据就可能失去了时间和值   对应不上的情况。------
    因为上班没仔细看,如有误解请原谅。
      

  5.   

    可能是我没有理解楼主的目的吧。
    还有,   
        /**
         * 判断两个时间是否处于同一个时间间隔内
         */
        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;
      

  6.   

    NodeInfo中,
    开始a有数据,而没有bcde的数据在时间间隔内,所以,他们对应的value都为0;
    如果8~9的时候,bcde在同一时间间隔内有数据,而a没有,那么aValue的值为0。
    无论那种情况,time的值都是abcde中存在并且最靠前的时间点。