TreeSet
public TreeSet(Comparator<? super E> comparator)
-
构造一个新的空 TreeSet,它根据指定比较器进行排序。插入到该 set 的所有元素都必须能够由指定比较器进行
相互比较:对于 set 中的任意两个元素
e1
和e2
,执行comparator.compare(e1, e2)
都不得抛出ClassCastException
。如果用户试图将违反此约束的元素添加到 set 中,则add
调用将抛出ClassCastException
。-
参数:
-
comparator
- 将用来对此 set 进行排序的比较器。如果该参数为null
,则使用元素的 自然顺序。
eg:
从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序:
1,张三,28
2,李四,35
3,张三,28
4,王五,35
5,张三,28
6,李四,35
7,赵六,28
8,田七,35
package en.enn.synchronize; 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.TreeSet; public class GetNameTest { /** * @param args */ public static void main(String[] args) { // InputStream ips = // GetNameTest.class.getResourceAsStream("/com/huawei/interview/info.txt"); // 用上一行注释的代码和下一行的代码都可以,因为info.txt与GetNameTest类在同一包下面,所以,可以用下面的相对路径形式 Map<String, Integer> results = new HashMap<String, Integer>(); InputStream ips = GetNameTest.class.getResourceAsStream("info.txt"); BufferedReader in = new BufferedReader(new InputStreamReader(ips)); String line = null; try { while ((line = in.readLine()) != null) { dealLine(line, results); } sortResults(results); } catch (IOException e) { e.printStackTrace(); } } static class User { public String name; public Integer value; public User(String name, Integer value) { this.name = name; this.value = value; } @Override public boolean equals(Object obj) { // 下面的代码没有执行,说明往treeset中增加数据时,不会使用到equals方法。 boolean result = super.equals(obj); System.out.println(result); return result; } } private static void sortResults(Map<String, Integer> results) { TreeSet<User> sortedResults = new TreeSet<User>( new Comparator<Object>() { public int compare(Object o1, Object o2) { User user1 = (User) o1; User user2 = (User) o2; /* * 如果compareTo返回结果0,则认为两个对象相等,新的对象不会增加到集合中去 * 所以,不能直接用下面的代码,否则,那些个数相同的其他姓名就打印不出来。 */ // return user1.value-user2.value; // return // user1.value<user2.value?-1:user1.value==user2.value?0:1; if (user1.value < user2.value) { return -1; } else if (user1.value > user2.value) { return 1; } else { int i = user1.name.compareTo(user2.name); return i; } } }); Iterator<String> iterator = results.keySet().iterator(); while (iterator.hasNext()) { String name = (String) iterator.next(); Integer value = (Integer) results.get(name); if (value > 1) { //当执行add方法时,执行指定的比较器:代码中的compare方法
-
-
sortedResults.add(new User(name, value)); } } printResults(sortedResults); } private static void printResults(TreeSet<User> sortedResults) { Iterator<User> iterator = sortedResults.iterator(); while (iterator.hasNext()) { User user = (User) iterator.next(); System.out.println(user.name + ":" + user.value); } } public static void dealLine(String line, Map<String, Integer> map) { if (!"".equals(line.trim())) { String[] results = line.split(","); if (results.length == 3) { String name = results[1]; Integer value = (Integer) map.get(name); if (value == null) value = 0; map.put(name, value + 1); } } } }