从类似如下的文本文件中读取出所有的姓名,并打印出
重复的姓名和重复的次数,并按重复次数排序:
1,张三,28 2,里斯,24 3,里斯,24 4,收到,42 5,收到,42 6,王五,42 7,赵六,24 8,赵六,24 9,赵六,24 10,赵六,24 11,田七,72 12,田七,72 13,田七,72
使用map来过滤重复的元素,并实现统计功能
然后使用TreeSet来实现排序功能
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.Map.Entry; public class TestGetNameSort { public void getSrc() throws IOException{ InputStream is=TestGetNameSort.class.getResourceAsStream("a.txt"); BufferedReader in = new BufferedReader(new InputStreamReader(is)); Map<String, Integer> map = new HashMap<String, Integer>(); String buf; while((buf = in.readLine())!=null){ String[] str = buf.split(","); if(str.length==3){ Integer value = map.get(str[1]); if(value == null) value=0; map.put(str[1], value+1); } } is.close(); in.close(); TreeSet<Person> ts = new TreeSet<Person>(new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { Person p1 = (Person)o1; Person p2 = (Person)o2; if(p1.getTimes()>p2.getTimes()) return 1; if(p1.getTimes()<p2.getTimes()) return -1; else return p1.getName().compareTo(p2.getName());//如果相等,这里将不会加入到集合 } }); Set<Entry<String,Integer>> entrySet = map.entrySet(); for (Entry<String, Integer> entry : entrySet) { String name=entry.getKey(); int times =entry.getValue(); Person p = new Person(name,times); ts.add(p); } for (Iterator<Person> iterator = ts.iterator(); iterator.hasNext();) { Person object = (Person) iterator.next(); if(object.getTimes()>1) System.out.println(object.getName()+" "+object.getTimes()); } } public static void main(String[] args) throws IOException { TestGetNameSort tst = new TestGetNameSort(); tst.getSrc(); } }
特别注意一点就是,Set集合中不允许相同的元素存在,所以在重载Comparator时如果返回0,将不会加入到集合中.