map 数据筛选和排序
来源:互联网 发布:hg的gp03d石斛兰淘宝 编辑:程序博客网 时间:2024/05/16 19:47
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
下面是代码:
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());}elseif(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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (os != null) {try {os.close();os = null;} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke1.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {if (ins != null) {try {ins.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}/** * 排序比较 * @author sfit0734 * */class MessageComparator implements Comparator<Map.Entry<String,MessageSenderInfo>> {@Overridepublic 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;}}}
0 0
- map 数据筛选和排序
- 使用 DataView 对数据排序和筛选
- 数据集的筛选和排序
- 脱机数据的排序、搜索和筛选
- 黑马程序员--数据筛选和排序
- 排序和筛选数据 (ADO.NET)
- 第六章 数据筛选和排序
- pandas筛选排序数据
- xsl中对xml数据的排序和筛选
- C#操作数据库(动态筛选和排序数据库数据)
- C#学习笔记(十二)-数据筛选和排序
- PourOver – 快速筛选和排序大的数据集合
- 使用Pandas对数据进行筛选和排序
- 带有本地数据排序和筛选的RecyclerView Adapter
- 使用Pandas对数据进行筛选和排序
- 【Python学习系列二十二】pandas数据筛选和排序
- 使用Pandas对数据进行筛选和排序
- 使用Pandas对数据进行筛选和排序
- Servlet虚拟路径映射
- redhat 安装gcc
- 一个标准的win32窗口
- Posts Tagged 【list】Reverse Linked List
- 《CURL技术知识教程》系列技术教程整理
- map 数据筛选和排序
- ANDROID ONTOUCHEVENT, ONCLICK及ONLONGCLICK的调用机制
- Pow(x,n) - LeetCode
- JS中文转换(UTF-8),url传递中文乱码解决
- vs上出现"未能加载项目文件,根级别上的数据无效.Microsoft.WinFx.targets"的解决方法
- MCU程序设计之STM32F10X的中断NVIC
- TCP/IP连接状态变迁图CLOSE_WAIT
- Hibernate参数设置
- mysql根据配置文件会限制server接受的数据包大小。