java算法面试题:从类似如下的文本文件中读取出…
2018-06-18 03:42:11来源:未知 阅读 ()
从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序
1,张三,28
2,李四,35
3,张三,28
4,王五,35
5,张三,28
6,李四,35
7,赵六,28
8,田七,35
package com.swift; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; public class IO_Sort_Select { public static void main(String[] args) throws IOException { /* * 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 */ File file_s = new File("e:\\neck\\data.docx"); File dir = new File("e:\\neck"); if (!dir.exists() && dir.isDirectory()) { System.out.println("目录不存在,即将创建..."); dir.mkdirs(); } File file_t = new File(dir, "data.txt"); List<String> list = new ArrayList<String>(); String text = readFromDocx(file_s); String[] hang = text.split("\\n"); for (int i = 0; i < hang.length; i++) { String[] lie = hang[i].split("\\,"); for (int j = 0; j < lie.length; j++) { if (j == 1) { list.add(lie[j]); } } } printList(list); Map<String, Integer> map = new TreeMap<String, Integer>(); for (String str : list) { map.put(str, 0); } for(String str:list) { if(map.containsKey(str)) { int num=map.get(str); num++; map.remove(str); map.put(str, num); } } List<Entry<String,Integer>> listMap=new ArrayList<Entry<String,Integer>>(map.entrySet()); Collections.sort(listMap, new Comparator<Entry<String,Integer>>(){ @Override public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) { int num=arg1.getValue()-arg0.getValue(); return num==0?arg0.getKey().compareTo(arg1.getKey()):num; } }); for(Entry<String, Integer> entry:listMap) { System.out.println("重复的姓名是 :"+entry.getKey()+" 重复的次数是:"+entry.getValue()); } } private static void printList(List<String> list) { for (String str : list) { System.out.println(str); } } public static String readFromDocx(File file) throws IOException { FileInputStream fis = new FileInputStream(file); XWPFDocument docx = new XWPFDocument(fis); XWPFWordExtractor extractor = new XWPFWordExtractor(docx); String text = extractor.getText(); return text; } }
上面代码读取的是docx的word文件,直接读取会出现乱码,因word中不仅有文本还有压缩的其他属性等内容,所以要使用poi的jar包进行解析
解析的jar包如下图
这个应该比较全面了,也可以解析excel操作或写入表格等
下载地址:
链接: https://pan.baidu.com/s/1htYPKLA 密码: e36e
下面是读取doc的方法
package com.swift; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.xwpf.extractor.XWPFWordExtractor; import org.apache.poi.xwpf.usermodel.XWPFDocument; public class IO_Sort_Select { public static void main(String[] args) throws IOException { /* * 从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 */ File file_s = new File("e:\\neck\\data.doc"); File dir = new File("e:\\neck"); if (!dir.exists() && dir.isDirectory()) { System.out.println("目录不存在,即将创建..."); dir.mkdirs(); } List<String> list = new ArrayList<String>(); String text = readFromDoc(file_s); String[] hang = text.split("\\r"); for (int i = 0; i < hang.length; i++) { System.out.println(hang.length); System.out.println(hang[i]); String[] lie = hang[i].split("\\,"); for (int j = 0; j < lie.length; j++) { if (j == 1) { list.add(lie[j]); } } } printList(list); Map<String, Integer> map = new TreeMap<String, Integer>(); for (String str : list) { map.put(str, 0); } for(String str:list) { if(map.containsKey(str)) { int num=map.get(str); num++; map.remove(str); map.put(str, num); } } List<Entry<String,Integer>> listMap=new ArrayList<Entry<String,Integer>>(map.entrySet()); Collections.sort(listMap, new Comparator<Entry<String,Integer>>(){ @Override public int compare(Entry<String, Integer> arg0, Entry<String, Integer> arg1) { int num=arg1.getValue()-arg0.getValue(); return num==0?arg0.getKey().compareTo(arg1.getKey()):num; } }); for(Entry<String, Integer> entry:listMap) { System.out.println("重复的姓名是 :"+entry.getKey()+" 重复的次数是:"+entry.getValue()); } } private static void printList(List<String> list) { for (String str : list) { System.out.println(str); } } public static String readFromDocx(File file) throws IOException { FileInputStream fis = new FileInputStream(file); XWPFDocument docx = new XWPFDocument(fis); XWPFWordExtractor extractor = new XWPFWordExtractor(docx); String text = extractor.getText(); return text; } public static String readFromDoc(File file) throws IOException { FileInputStream fis = new FileInputStream(file); HWPFDocument doc = new HWPFDocument(fis); String text = doc.getDocumentText(); return text; } }
doc读取出来的文本还不能用"\\n"进行行分割,用的是"\\r"才行,要不然只能分割出1行,这点注意,要不会觉得程序莫名其妙不安自己的思路走
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java入门篇(六)——类和对象
下一篇:Java 二分查找
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash