任务8

【任务8.1.1】对IDataAnalyse类方法返回值使用泛型集合升级

Object[]---ArrayList<?>

程序设计

package com.qst.dms.gather;

import com.qst.dms.exception.DataAnalyseException;

import java.util.ArrayList;

public interface IDataAnalyse<T> {
    ArrayList<?> matchData() throws DataAnalyseException;
}

【任务8.1.2】对DataFilter类成员属性使用泛型集合升级,类型参数是有界的(DataBase的子类)

DataBase[]---ArrayList<? extends DataBase>

程序设计

package com.qst.dms.gather;

import com.qst.dms.entity.DataBase;


import java.util.ArrayList;

public abstract class DataFilter<T extends DataBase> {
    // 数据集合
    private ArrayList<? extends DataBase> datas;

    // 构造方法
    public DataFilter(ArrayList<? extends DataBase> datas) {
        this.datas = datas;
    }

    // 获取数据集合
    public ArrayList<? extends DataBase> getDatas() {
        return datas;
    }

    // 设置数据集合
    public void setDatas(ArrayList<? extends DataBase> datas) {
        this.datas = datas;
    }

    // 数据过滤抽象方法
    public abstract void doFilter();
}

【任务8.2】对LogRecAnalyse类成员属性使用泛型集合升级,相关数据集合进行泛型升级

    // “登录”集合
	private List<LogRec> logIns= new ArrayList<>();
	// “登出”集合
	private List<LogRec> logOuts= new ArrayList<>();


    // 获取数据集合
	List<LogRec> logs = (ArrayList<LogRec>) this.getDatas();

    // 创建日志匹配数组
    List<MatchedLogRec> matchLogs = new ArrayList<>();

程序设计

package com.qst.dms.gather;

import com.qst.dms.entity.DataBase;
import com.qst.dms.entity.LogRec;
import com.qst.dms.entity.MatchedLogRec;
import com.qst.dms.exception.DataAnalyseException;

import java.util.ArrayList;
import java.util.List;

public class LogRecAnalyse extends DataFilter<LogRec> implements IDataAnalyse {
    // “登录”集合
    private List<LogRec> logIns = new ArrayList<>();
    // “登出”集合
    private List<LogRec> logOuts = new ArrayList<>();

    public LogRecAnalyse(List<LogRec> datas) {
        super((ArrayList<? extends DataBase>) datas);
    }

    // 实现DataFilter抽象类中的过滤抽象方法
    @Override
    public void doFilter() {
        // 获取数据集合
        List<LogRec> datas = (List<LogRec>) getDatas();
        // 根据日志登录状态统计不同状态的日志个数
        int numIn = 0;
        int numOut = 0;
        // 遍历统计
        for (LogRec data : datas) {
            if (data.getLogType() == LogRec.LOG_IN) {
                numIn++;
            } else if (data.getLogType() == LogRec.LOG_OUT) {
                numOut++;
            }
        }
        // 创建登录、登出集合
        logIns = new ArrayList<>(numIn);
        logOuts = new ArrayList<>(numOut);
        // 遍历,对日志数据进行过滤,根据日志登录状态分别放在不同的集合中
        for (LogRec data : datas) {
            if (data.getLogType() == LogRec.LOG_IN) {
                logIns.add(data);
            } else if (data.getLogType() == LogRec.LOG_OUT) {
                logOuts.add(data);
            }
        }
    }

    // 实现IDataAnalyse接口中数据分析方法
    @Override
    public  ArrayList<MatchedLogRec> matchData() throws DataAnalyseException {
        if (logIns.size() == 0 || logOuts.size() == 0) {
            throw new DataAnalyseException("没有匹配的日志数据");
        }

        // 创建日志匹配集合
        ArrayList<MatchedLogRec> matchLogs = new ArrayList<>();
        // 数据匹配分析
        for (LogRec in : logIns) {
            for (LogRec out : logOuts) {
                if ((in.getUser().equals(out.getUser()))
                        && (in.getIp().equals(out.getIp()))
                        && out.getType() != DataBase.MATHCH) {
                    // 修改in和out日志状态类型为“匹配”
                    in.setType(DataBase.MATHCH);
                    out.setType(DataBase.MATHCH);
                    // 添加到匹配集合中
                    matchLogs.add(new MatchedLogRec(in, out));
                }
            }
        }
        if (matchLogs.size() == 0) {
            throw new DataAnalyseException("没有匹配的日志数据");
        }
        return matchLogs;
    }

}

【任务8.3】对TransportAnalyse类成员属性使用泛型集合升级

    // 发货集合
	private List<Transport> transSends = new ArrayList<>();
	// 送货集合
	private List<Transport> transIngs = new ArrayList<>();
	// 已签收集合
	private List<Transport> transRecs = new ArrayList<>();


    // 获取数据集合
    List<Transport> trans = (List<Transport>) this.getDatas();


    // 创建物流匹配集合
    List<MatchedTransport> matchTrans = new ArrayList<>();

程序设计

package com.qst.dms.gather;

import com.qst.dms.entity.DataBase;
import com.qst.dms.entity.MatchedTransport;
import com.qst.dms.entity.Transport;
import com.qst.dms.exception.DataAnalyseException;

import java.util.ArrayList;
import java.util.List;

public class TransportAnalyse extends DataFilter implements IDataAnalyse {
    // 成员属性
    private List<Transport> transSends = new ArrayList<>();
    private List<Transport> transIngs = new ArrayList<>();
    private List<Transport> transRecs = new ArrayList<>();

    // 构造方法
    public TransportAnalyse(List<Transport> trans) {
        super((ArrayList<? extends DataBase>) trans);
    }

    // 实现DataFilter抽象类中的过滤抽象方法
    @Override
    public void doFilter() {
        // 获取数据集合
        List<Transport> trans = (List<Transport>) getDatas();

        // 根据物流状态统计不同状态的物流个数
        int numSend = 0;
        int numTran = 0;
        int numRec = 0;

        // 遍历统计
        for (Transport tran : trans) {
            if (tran.getTransportType() == Transport.SENDING) {
                numSend++;
            } else if (tran.getTransportType() == Transport.TRANSPORTING) {
                numTran++;
            } else if (tran.getTransportType() == Transport.RECEIVED) {
                numRec++;
            }
        }

        // 创建不同状态的物流集合
        transSends = new ArrayList<>(numSend);
        transIngs = new ArrayList<>(numTran);
        transRecs = new ArrayList<>(numRec);

        // 遍历,对物流数据进行过滤,根据物流状态分别放在不同的集合中
        for (Transport tran : trans) {
            if (tran.getTransportType() == Transport.SENDING) {
                transSends.add(tran);
            } else if (tran.getTransportType() == Transport.TRANSPORTING) {
                transIngs.add(tran);
            } else if (tran.getTransportType() == Transport.RECEIVED) {
                transRecs.add(tran);
            }
        }
    }

    // 实现IDataAnalyse接口中数据分析方法
    @Override
    public ArrayList<MatchedTransport> matchData() throws DataAnalyseException {

        if (transSends.isEmpty() || transIngs.isEmpty() || transRecs.isEmpty()) {
            throw new DataAnalyseException("没有匹配的物流数据");
        }

        // 创建物流匹配集合
        ArrayList<MatchedTransport> matchTrans = new ArrayList<>();

        // 数据匹配分析
        for (Transport send : transSends) {
            for (Transport tran : transIngs) {
                for (Transport rec : transRecs) {
                    if (send.getReciver().equals(tran.getReciver())
                            && send.getReciver().equals(rec.getReciver())
                            && tran.getType() != DataBase.MATHCH
                            && rec.getType() != DataBase.MATHCH) {
                        // 修改物流状态类型为“匹配”
                        send.setType(DataBase.MATHCH);
                        tran.setType(DataBase.MATHCH);
                        rec.setType(DataBase.MATHCH);

                        // 添加到匹配集合中
                        matchTrans.add(new MatchedTransport(send, tran, rec));
                    }
                }
            }
        }
        if (matchTrans.isEmpty()) {
            throw new DataAnalyseException("没有匹配的物流数据");
        }
        return matchTrans;
    }
}

【任务8.4.1】对LogRecService类成员属性使用泛型集合升级

// 匹配日志信息输出,参数是集合
public void showMatchLog(List<MatchedLogRec> matchLogs)

程序设计

package com.qst.dms.service;

import com.qst.dms.entity.LogRec;
import com.qst.dms.entity.MatchedLogRec;
import sun.rmi.runtime.Log;

import java.util.Date;
import java.util.List;
import java.util.Scanner;

public class LogRecService {
    private Scanner scanner;

    public LogRecService() {
        scanner = new Scanner(System.in);
    }

    public LogRec inputLog() {
        int id, type, logType;
        Date nowDate;
        String address;
        String user;
        String ip;
        while (true) {
            try {
                System.out.println("请输入ID标识:");
                id = scanner.nextInt();
                nowDate = new Date();

                System.out.println("请输入地址:");
                address = scanner.next();
                type = LogRec.GATHER;

                System.out.println("请输入登录用户名:");
                user = scanner.next();

                System.out.println("请输入主机IP:");
                ip = scanner.next();

                System.out.println("请输入登录状态(1表示登录,0表示登出):");
                logType = scanner.nextInt();
                if (logType == 0 || logType == 1) {
                    break;
                } else {
                    throw new IllegalArgumentException("非法的登录状态");
                }
            } catch (Exception e) {
                System.out.println("输入错误,请重新输入");
                scanner.nextLine();
            }
        }
        return new LogRec(id, nowDate, address, type, user, ip, logType);
    }

    public void showLog(List<LogRec> logRecs) {
        System.out.println("日志信息:");
        for (LogRec logRec : logRecs) {
            System.out.println(logRec);
        }
    }

    // 匹配日志信息输出,参数是集合
    public void showMatchLog(List<MatchedLogRec> matchLogs) {
        System.out.println("匹配日志信息:");
        for (MatchedLogRec matchLog : matchLogs) {
            System.out.println(matchLog);
        }
    }
}

【任务8.4.2】对TransportService类成员属性使用泛型集合升级

    // 匹配的物流信息输出,参数是集合
	public void showMatchTransport(List<MatchedTransport> matchTrans)

程序设计

package com.qst.dms.service;

import com.qst.dms.entity.MatchedLogRec;
import com.qst.dms.entity.MatchedTransport;
import com.qst.dms.entity.Transport;

import java.util.Date;
import java.util.List;
import java.util.Scanner;

public class TransportService {
    private Scanner scanner;

    public TransportService() {
        scanner = new Scanner(System.in);
    }

    public Transport inputTransport() {
        int transportType;
        int id, type;
        Date nowDate;
        String address, handler, receiver;

        while (true) {
            try {
                System.out.println("请输入ID标识:");
                id = scanner.nextInt();
                nowDate = new Date();
                System.out.println("请输入地址:");
                address = scanner.next();
                type = Transport.GATHER;
                System.out.println("请输入货物经手人:");
                handler = scanner.next();
                System.out.println("请输入收货人:");
                receiver = scanner.next();
                System.out.println("请输入物流状态(1表示发货中,2表示送货中,3表示已签收):");
                transportType = scanner.nextInt();
                if (transportType == 1 || transportType == 2 || transportType == 3) {
                    break;
                } else {
                    throw new IllegalArgumentException("非法的物流状态");
                }
            } catch (Exception e) {
                System.out.println("输入错误,请重新输入");
                scanner.nextLine();
            }
        }

        return new Transport(id, nowDate, address, type, handler, receiver, transportType);
    }

    public void showTransport(List<Transport> transports) {
        System.out.println("物流信息:");
        for (Transport transport : transports) {
            System.out.println(transport);
        }
    }

    // 匹配物流信息输出,参数是集合
    public void showMatchTransport(List<MatchedTransport> matchTrans) {
        System.out.println("匹配物流信息:");
        for (MatchedTransport matchTran : matchTrans) {
            System.out.println(matchTran);
        }
    }
}

【任务8.5】完善MenuDriver类,整合数据采集、数据匹配、数据显示功能

// 建立一个从键盘接收数据的扫描器
Scanner scanner = new Scanner(System.in);

// 创建一个泛型ArrayList集合存储日志数据
List<LogRec> logRecList = new ArrayList<>();
// 创建一个泛型ArrrayList集合存储物流数据
List<Transport> transportList = new ArrayList<>();

// 创建一个日志业务类
LogRecService logService = new LogRecService();
// 创建一个物流业务类
TransportService tranService = new TransportService();

// 日志数据匹配集合
List<MatchedLogRec> matchedLogs = null;
// 物流数据匹配集合
List<MatchedTransport> matchedTrans = null;

   在每个菜单中添加数据类型选择
System.out.println("请输入采集数据类型:1.日志    2.物流");
// 接收键盘输入的选项
int type = scanner.nextInt();
if (type == 1) {
System.out.println("正在采集日志数据,请输入正确信息,确保数据的正常采集!");
// 采集日志数据
LogRec log = logService.inputLog();
// 将采集的日志数据添加到logRecList集合中
logRecList.add(log);
} else if (type == 2) {
System.out.println("正在采集物流数据,请输入正确信息,确保数据的正常采集!");
// 采集物流数据
Transport tran = tranService.inputTransport();
// 将采集的物流数据添加到transportList集合中
transportList.add(tran);
}

程序设计

package com.qst.dms.dos;

import com.qst.dms.entity.LogRec;
import com.qst.dms.entity.MatchedLogRec;
import com.qst.dms.entity.MatchedTransport;
import com.qst.dms.entity.Transport;
import com.qst.dms.exception.DataAnalyseException;
import com.qst.dms.gather.LogRecAnalyse;
import com.qst.dms.gather.TransportAnalyse;
import com.qst.dms.service.LogRecService;
import com.qst.dms.service.TransportService;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MenuDriver {

    public static void main(String[] args) {
        // 建立一个从键盘接收数据的扫描器
        Scanner scanner = new Scanner(System.in);

        // 创建一个泛型ArrayList集合存储日志数据
        List<LogRec> logRecList = new ArrayList<>();
        // 创建一个泛型ArrrayList集合存储物流数据
        List<Transport> transportList = new ArrayList<>();

        // 创建一个日志业务类
        LogRecService logService = new LogRecService();
        // 创建一个物流业务类
        TransportService tranService = new TransportService();

        // 日志数据匹配集合
        List<MatchedLogRec> matchedLogs = null;
        // 物流数据匹配集合
        List<MatchedTransport> matchedTrans = null;

        // 运行菜单选择
        while (true) {
            System.out.println("请选择操作:");
            System.out.println("1. 采集数据");
            System.out.println("2. 数据匹配");
            System.out.println("3. 显示数据");
            System.out.println("4. 退出");

            // 接收键盘输入的选项
            try {
                int choice = scanner.nextInt();
                int type;
                switch (choice) {
                    case 1:
                        System.out.println("请输入采集数据类型:1.日志  2.物流");
                        // 接收键盘输入的选项
                        type = scanner.nextInt();
                        if (type == 1) {
                            System.out.println("正在采集日志数据,请输入正确信息,确保数据的正常采集!");
                            // 采集日志数据
                            LogRec log = logService.inputLog();
                            // 将采集的日志数据添加到logRecList集合中
                            logRecList.add(log);
                        } else if (type == 2) {
                            System.out.println("正在采集物流数据,请输入正确信息,确保数据的正常采集!");
                            // 采集物流数据
                            Transport tran = tranService.inputTransport();
                            // 将采集的物流数据添加到transportList集合中
                            transportList.add(tran);
                        }
                        break;
                    case 2:
                        System.out.println("请输入匹配数据类型:1.日志  2.物流");
                        // 接收键盘输入的选项
                        type = scanner.nextInt();
                        if (type == 1) {
                            System.out.println("匹配日志数据如下:");
                            // 数据匹配
                            // 创建日志数据分析对象
                            LogRecAnalyse logAnalyse = new LogRecAnalyse(logRecList);

                            // 日志数据过滤
                            logAnalyse.doFilter();

                            // 日志数据匹配分析
                            try {
                                List<MatchedLogRec> objs = logAnalyse.matchData(); // 进行数据匹配
                                // 处理匹配的日志数据
                                // 判断objs集合是否是配置日志集合
                                if (objs instanceof List<?>) {
                                    // 将集合强制类型转换成配置日志集合
                                    matchedLogs = (List<MatchedLogRec>) objs;

                                    // 输出匹配的日志信息
                                    for (MatchedLogRec log : matchedLogs) {
                                        if (log != null) {
                                            System.out.println(log);
                                        }
                                    }
                                }
                            } catch (DataAnalyseException e) {
                                System.out.println(e.getMessage());
                            }
                        } else if (type == 2) {
                            System.out.println("匹配物流数据如下:");
                            // 数据匹配
                            // 创建物流数据分析对象
                            TransportAnalyse ta = new TransportAnalyse(transportList);

                            // 物流数据过滤
                            ta.doFilter();

                            try {
                                // 物流数据分析
                                List<MatchedTransport> objs = ta.matchData();
                                // 判断objs集合是否是匹配物流集合
                                if (objs instanceof List<?>) {
                                    // 将集合强制类型转换成匹配物流集合
                                    matchedTrans = (List<MatchedTransport>) objs;

                                    // 输出匹配的物流信息
                                    for (MatchedTransport log : matchedTrans) {
                                        if (log != null) {
                                            System.out.println(log);
                                        }
                                    }
                                }
                            } catch (DataAnalyseException e) {
                                System.out.println(e.getMessage());
                            }
                        }
                        break;
                    case 3:
                        System.out.println("请输入显示原始数据类型:1.日志  2.物流");
                        // 接收键盘输入的选项
                        type = scanner.nextInt();
                        if (type == 1) {
                            // 显示日志数据
                            System.out.println("日志数据如下:");
                            try {
                                logService.showLog(logRecList);
                            } catch (Exception e) {
                                System.out.println("未录入日志数据!");
                            }

                        } else if (type == 2) {
                            // 显示物流数据
                            System.out.println("物流数据如下:");
                            try {
                                tranService.showTransport(transportList);
                            } catch (Exception e) {
                                System.out.println("未录入物流数据!");
                            }
                        }
                        break;
                    case 4:
                        System.out.println("谢谢使用!");
                        return;
                    default:
                        System.out.println("无效选项,请重新选择!");
                }
            } catch (Exception e) {
                System.out.println("非法输入,请重新输入!");
                scanner.nextLine();
            }
        }
    }
}

测试

【技能实训】DMS数据挖掘项目-Day08-LMLPHP

07-13 16:17