map数据的分组,list数据排序 数据筛选

sfit0144 (李四) 2015-01-10 18:00:25
1
Sfit0734 (Sfit0734) 2015-01-10 18:00:38
go home
sfit0144 (李四) 2015-01-10 18:09:52
下班
261340 (叶在宗) 2015-01-10 18:10:05
图片: {5F4C20B4-134F-4014-801D-8FFBA58587E9}.png
sfit0513 (蒋大有) 2015-01-10 18:43:55
下班
sfit0122 (雷一果) 2015-01-10 19:06:16
下班

将上面数据分析成下面格式,上面数据也是存在于文件当中,下面数据也是分析完后最后也放在文件当中

打卡日期    姓名      上班打卡             下班打卡             
2015-01-10  何科                           2015-01-10 19:46:05
2015-01-10  刘俊                           2015-01-10 20:39:00
2015-01-10  匡磊                           2015-01-10 19:43:52
2015-01-10  叶在宗                         2015-01-10 18:10:05
2015-01-10  李四      2015-01-10 18:00:25  2015-01-10 18:09:52
2015-01-10  蒋大有                         2015-01-10 18:43:55
2015-01-10  雷一果                         2015-01-10 19:06:16
2015-01-13  何科      2015-01-13 09:22:58  2015-01-13 19:01:07
2015-01-13  刘俊      2015-01-13 09:26:34  2015-01-13 19:28:37

下面是代码:

public class MessageHistory {

    Map<String, MessageSenderInfo> lines = new HashMap<String, MessageSenderInfo>();
    String outputPath;
    public static void main(String[] args) {
        MessageHistory messageHistory = new MessageHistory();
        messageHistory.multiReadMessage();
        messageHistory.outputCardRecordsToFile();
    }
    
    public MessageHistory() {
        outputPath = System.getProperty("user.dir")+File.separator+formatDate(new Date()) + "—打卡记录.txt";
        File f = new File(outputPath);
        if(f.exists()){
            f.delete();
        }
    }

    
    /**
     * 消息文件以work开头
     * 读取文件
     */
    public void multiReadMessage(){
        File dir = new File(System.getProperty("user.dir"));
        if(dir.getParentFile().exists()){
            for(File file:dir.listFiles()){
                if(file.getName().trim().matches("^work.*\.txt$")){
                    System.out.println("start read "+file.getAbsolutePath());
                    readMessage(file.getAbsolutePath());
                }
            }
        }
    }

    public void lineToMap(String line) {
        if (line.matches("^[A-Za-z0-9]{6}.*")) {
            int index = line.indexOf("(");
            int lastIndex = line.lastIndexOf(")");
            if (index > 0 && lastIndex > 0) {
                String workCode = line.substring(0, index);
                String name = line.substring(index + 1, lastIndex);
                String dateStr = line.substring(lastIndex + 1).trim();
                Date date = parseDate(dateStr);
                String key = formatDate(date) + "--" + workCode;
                MessageSenderInfo recoderBean = lines.get(key);
                if (recoderBean == null) {
                    recoderBean = new MessageSenderInfo(workCode, name);
                    recoderBean.setAtWorkTime(date);
                } else {
                    if (recoderBean.getOffWorkTime() == null) {
                        recoderBean.setOffWorkTime(date);
                    }else{
                        if(date.getTime() < recoderBean.getAtWorkTime().getTime()){
                            recoderBean.setAtWorkTime(date);
                        }else if(date.getTime() > recoderBean.getOffWorkTime().getTime()){
                            recoderBean.setOffWorkTime(date);
                        }
                    }

                }
                lines.put(key, recoderBean);
            }
        }
    }

    public List<Map.Entry<String,MessageSenderInfo>> sortMessage(){
        List<Map.Entry<String,MessageSenderInfo>> list = new ArrayList<Map.Entry<String,MessageSenderInfo>>(lines.entrySet());
        Collections.sort(list, new MessageComparator());
        return  list;
    }
    /**
     * 输出到文件
     */
    public void outputCardRecordsToFile() {
        printHeader();
        System.out.println("总记录:"+lines.size());
        List<Map.Entry<String,MessageSenderInfo>> list = sortMessage();
        for (Map.Entry<String, MessageSenderInfo> e : list) {
            MessageSenderInfo messageSenderInfo = e.getValue();
            String line = formatDate(messageSenderInfo.getAtWorkTime()) + "  "+
                    formatStringLen(messageSenderInfo.getName(),8) + "  " ;
            if(messageSenderInfo.getOffWorkTime() == null){
                if(getHour(messageSenderInfo.getAtWorkTime()) >= 12){
                    line += formatStringLen("",21);
                }
                line+=formatLongDate(messageSenderInfo.getAtWorkTime());
            }else
            if(messageSenderInfo.getOffWorkTime() != null){
                line += formatLongDate(messageSenderInfo.getAtWorkTime()) + "  " ;
                line+=formatLongDate(messageSenderInfo.getOffWorkTime());
            }
            writeLine(outputPath, line);
        }
    }
    /**
     * 打印头部
     */
    public void printHeader(){
        String line = formatStringLen("打卡日期",12)+
        formatStringLen("姓名",10)+
        formatStringLen("上班打卡",21)+
        formatStringLen("下班打卡",21);
        writeLine(outputPath, line);
    }
    
    /**
     * 格式化字符串长度
     * @param s
     * @param len
     * @return
     */
    public String formatStringLen(String s, int len) {
        if (len > s.getBytes().length) {
            StringBuilder sBuilder = new StringBuilder(s);
            for (int i = 0; i < len - s.getBytes().length; i++) {
                sBuilder.append(" ");
            }
            return sBuilder.toString();
        }
        return s;
    }
    
    public void writeLine(String path, String s) {
        File f = new File(path);
        OutputStream os = null;
        try {
            os = new FileOutputStream(f, true);
            Writer wirte = new OutputStreamWriter(os, "UTF-8");
            BufferedWriter bufferedWriter = new BufferedWriter(wirte);
            bufferedWriter.write(s);
            bufferedWriter.newLine();
            bufferedWriter.flush();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (os != null) {
                try {
                    os.close();
                    os = null;
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    
    public void readMessage(String path) {
        InputStream ins = null;
        BufferedReader buf = null;
        try {
            ins = new FileInputStream(path);
            buf = new BufferedReader(new InputStreamReader(ins, codeString(path)));
            String line = null;
            while ((line = buf.readLine()) != null) {
                lineToMap(line.trim());
            }
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (ins != null) {
                try {
                    ins.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    
    /**
     * 排序比较
     * @author sfit0734
     *
     */
    class MessageComparator implements Comparator<Map.Entry<String,MessageSenderInfo>> {
        @Override
        public int compare(Map.Entry<String,MessageSenderInfo> e1, Map.Entry<String,MessageSenderInfo> e2) {
            MessageSenderInfo m1 = e1.getValue();
            MessageSenderInfo m2 = e2.getValue();
            String dateStr = formatDate(m1.getAtWorkTime());
            String dateStr1 = formatDate(m2.getAtWorkTime());
            
            int result =  dateStr.compareTo(dateStr1);
            if(result != 0){
                return result;
            }else{
                return m1.getName().compareTo(m2.getName());
            }
        }
    };


    public Date parseDate(String dataStr) {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //String dateString = formatter.format(currentTime);
        Date date = null;
        try {
            date = formatter.parse(dataStr);
        } catch (ParseException e) {

            e.printStackTrace();
        }
        return date;
    }

    public String formatDate(Date date) {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(date);
        
        return dateString;
    }

    public String formatLongDate(Date date) {
        DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(date);
        
        return dateString;
    }
    /**
     * 获取小时
     * @param d
     * @return
     */
    public int getHour(Date d){
        Calendar cal=Calendar.getInstance();
        cal.setTime(d);
        
        return cal.get(Calendar.HOUR_OF_DAY);
    }
    
    /**
     * 判断文件的编码格式
     * @param fileName :file
     * @return 文件编码格式
     * @throws IOException
     * @throws Exception
     */  
    public  String codeString(String fileName) throws IOException {  
        BufferedInputStream bin = new BufferedInputStream(  
        new FileInputStream(fileName));  
        int p = (bin.read() << 8) + bin.read();  
        String code = null;  
          
        switch (p) {  
            case 0xefbb:  
                code = "UTF-8";  
                break;  
            case 0xfffe:  
                code = "Unicode";  
                break;  
            case 0xfeff:  
                code = "UTF-16BE";  
                break;  
            default:  
                code = "GBK";  
        }  
          
        return code;  
    }  
    
    class MessageSenderInfo {
        String workCode;
        String name;
        Date atWorkTime;
        Date offWorkTime;

        public MessageSenderInfo() {
            super();
            // TODO Auto-generated constructor stub
        }

        public MessageSenderInfo(String workCode, String name) {
            super();
            this.workCode = workCode;
            this.name = name;

        }

        public String getWorkCode() {
            return workCode;
        }

        public void setWorkCode(String workCode) {
            this.workCode = workCode;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Date getAtWorkTime() {
            return atWorkTime;
        }

        public void setAtWorkTime(Date atWorkTime) {
            this.atWorkTime = atWorkTime;
        }

        public Date getOffWorkTime() {
            return offWorkTime;
        }

        public void setOffWorkTime(Date offWorkTime) {
            this.offWorkTime = offWorkTime;
        }
    }
}