从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:
1,张三,28
2,李四,35
3,张三,28
4,王五,35
5,张三,28
6,李四,35
7,赵六,28
8,田七,35
一、思路:
1、对于读取文件,要熟悉掌握bufferReader类。它可以一次读一行,读取结束的标志是null。
2、可以用集合处理代码重复,比如list(可重复)和 map(键值对)等。
即:取出每一行的内容,放入list集合中,读出每个内容中的name跟map中的key进行比较,如果name等于map的key,则map的value+1,否则value=1 。把name和value分别存入map中。
二、代码
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; /** 1、读取文件,创建BufferedReader对象,BufferedReader类可以一次读取一行 2、创建 ArrayList 对象,重复有序,可用于存放全部的数据 3、创建一个map集合,进行键的比较,将名字存为键,判断key是否相同,key相同则value自加1. */ public class question5{ public static void main(String[] args) throws IOException { File f = new File("D:" + File.separator + "a.txt"); BufferedReader bf = new BufferedReader(new FileReader(f)); ArrayList<String> list = new ArrayList<String>();//放所有值 Map<String, Integer> map = new HashMap<String, Integer>(); //存放重复信息 String temp = null; // 读取文件,把取出的每一行放入到list中,readLine()一次读取一行 while ((temp = bf.readLine()) != null) { list.add(temp); } //遍历计算重复数据和不重复数据 for (int i = 0; i < list.size(); i++) { String str = list.get(i).split(",")[1]; //[1]:获取在中找到的数组的第二项,即获取名字 boolean flag = false; // 如果出现过,value值加1 // entrySet()返回一个Map.Entry实例化后的对象集,表示一个Set集合 for (Map.Entry<String, Integer> entry : map.entrySet()) { if (entry.getKey().equals(str)) { entry.setValue(entry.getValue() + 1); flag = true; break; } } // 如果没有出现过,加入map if (!flag) { map.put(str, 1); } } // 遍历用于输出重复名字和次数 for (Map.Entry<String, Integer> entry : map.entrySet()) { if (entry.getValue() > 1) { System.out.println("\"" + entry.getKey() + "\"" + "重复次数:" + entry.getValue()); } } } }
本人的笔记都是为了让自己记住并且便于复习很多容易忘记的知识点,不做任何商用。期间可能借鉴了很多前辈的解释,有各个网站上的相关内容借鉴总结,也有书籍里的总结,所以并没有标注来源,如有雷同敬请谅解。
浙公网安备 33010602011771号