A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 HM朱蛟 于 2013-4-27 19:13 编辑

Collections.reverseOrder())是返回一个强制反转的比较器。它具有2种形态,有参(自定义comparator)和无参(默认comparator)的。
--------------------------------------------------------------------------------------------------------------
21天的练习题代码:

从104行开始:
Comparator<Student> cmp = Collections.reverseOrder();
Set<Student> stus = StuTool.StuToolRead(cmp);

这两句为什么不能写成:
Set<Student> stus = StuTool.StuToolRead(Collections.reverseOrder());

我试了下写成这种他要报错:

C:\Documents and Settings\Administrator\桌面\BH-temp>javac fx.java
fx.java:122: 找不到符号
符号: 方法 StuToolRead(java.util.Comparator<java.lang.Object>)
位置: 类 StuTool
                Set<Student> stus = StuTool.StuToolRead(Collections.reverseOrder());
                                           ^
Code:

  1. *import java.io.*;
  2. import java.util.*;

  3. class Student implements Comparable<Student>
  4. {
  5. private String name;
  6. private int en,cn,ma,sum;

  7. public int compareTo(Student s)
  8. {
  9. int num = new Integer(this.sum).compareTo(new Integer(s.sum));

  10. if(num == 0)
  11. return this.name.compareTo(s.name);

  12. return num;
  13. }

  14. public int hashCode()//err
  15. {
  16. return name.hashCode()+sum*34;
  17. }

  18. public boolean equals(Object obj)
  19. {
  20. if(!(obj instanceof Student))
  21. throw new ClassCastException("不是学生类");

  22. Student s = (Student)obj;
  23. return this.name.equals(s.name) && this.sum == s.sum;
  24. }

  25. Student(String name,int en,int cn,int ma)
  26. {
  27. this.name = name;
  28. this.en = en;
  29. this.cn = cn;
  30. this.ma = ma;
  31. sum = en+cn+ma;
  32. }

  33. public String toString()
  34. {
  35. return "name= "+name+",en= "+en+",cn= "+cn+",ma= "+ma+";"+"\t"+"sum="+sum;
  36. }
  37. }

  38. class StuTool //定义该类是为了操作学生类
  39. {
  40. public static Set<Student> StuToolRead() throws IOException
  41. {
  42. return StuToolRead(null);
  43. }

  44. public static Set<Student> StuToolRead(Comparator<Student> cmp) throws IOException
  45. {
  46. /*IO操作,输入,存入*/

  47. //建容器存学生
  48. TreeSet<Student> ts = null;

  49. if(cmp==null)
  50. ts = new TreeSet<Student>();
  51. else
  52. ts = new TreeSet<Student>(cmp);


  53. String s =null; //读写
  54. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读:键盘获取字节,字节->字符。

  55. while((s= br.readLine())!=null)//读
  56. {
  57. if(s.equals("over")) //结束标记
  58. break;

  59. String [] str = s.split(",");//切割
  60. ts.add(new Student( str[0],Integer.parseInt(str[1]),//读一行,装一个学生到集合里去
  61. Integer.parseInt(str[2]),
  62. Integer.parseInt(str[3])));

  63. }
  64. br.close();
  65. return ts;
  66. }

  67. public static void StuToolWrite(Set<Student> stus) throws IOException
  68. {
  69. BufferedWriter bw = new BufferedWriter(new FileWriter("StuInfo.txt"));//写:关联目的地

  70. for (Student s : stus)
  71. {
  72. bw.write(s.toString());
  73. bw.flush();
  74. bw.newLine();
  75. }
  76. bw.close();
  77. }
  78. }

  79. class Run
  80. {
  81. public static void main(String [] args) throws IOException
  82. {
  83. Comparator<Student> cmp = Collections.reverseOrder();

  84. Set<Student> stus = StuTool.StuToolRead(cmp);
  85. StuTool.StuToolWrite(stus);
  86. }
  87. }
复制代码
API:
reverseOrderpublic static <T> Comparator<T> reverseOrder()返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。(自然顺序是通过对象自身的 compareTo 方法强行排序的。)此方法允许使用单个语句,以逆自然顺序对实现了 Comparable 接口的对象 collection(或数组)进行排序(或维护)。例如,假设 a 是一个字符串数组。那么:                Arrays.sort(a, Collections.reverseOrder());将按照逆字典(字母)顺序对数组进行排序。 返回的比较器是可序列化的。
返回: 返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
本帖最后由 HM朱蛟 于 2013-4-29 08:07 编辑
孙胜 发表于 2013-4-29 08:00
他还有个重载的函数
Collections.reverseOder(cmp)传给集合的构造函数就OK了


哥们儿你说的这个有参数的Collections.reverseOder(cmp) ,这个是专门处理自定义比较器反转的啊。 和我发的代码有啥联系呢?{:soso_e132:}
回复 使用道具 举报
HM朱蛟 发表于 2013-4-29 05:13
这样写是可以  我在考虑我发的代码该如何写成一句啊? 它是通过函数传递的反转比较器  这样传递,泛型该 ...

他还有个重载的函数
Collections.reverseOder(cmp)传给集合的构造函数就OK了
回复 使用道具 举报
孙胜 发表于 2013-4-27 22:27
怎么不可,完全可以

这样写是可以  我在考虑我发的代码该如何写成一句啊? 它是通过函数传递的反转比较器  这样传递,泛型该怎么定义是个问题啊  结合上下文来看  我还真没想出该怎么写。。。
回复 使用道具 举报
怎么不可,完全可以
  1. public static void main(String [] args) {

  2. //不加比较器打印1,3,5,逆转之后打印5,3,1
  3.                 TreeSet<Integer> list = new TreeSet<Integer>(Collections.reverseOrder());
  4.                 list.add(3);
  5.                 list.add(5);
  6.                 list.add(1);
  7.                
  8.                 for(Integer i : list) {
  9.                         System.out.println(i);
  10.                 }
  11.         }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马