黑马程序员技术交流社区

标题: 实在想不懂,为什么只循环一次? [打印本页]

作者: 油炸电视剧    时间: 2015-5-16 12:27
标题: 实在想不懂,为什么只循环一次?
题目是这样的:
1.现有Student类,属性有name, age, score(int类型).
        要求 : 按照学生的分数排序, 分数大的童鞋在前面, 如果分数相同, 那么年龄小的在前面, 如果分数年龄都相同, 则按照姓名(英文的即可)的字典顺序排序.要求:不允许在描述类上写排序规则.
下面是给大家学生.
Student("Tom",24, 89)
Student("Robin",32, 99));
Student("Jerry",24, 99));
Student("Lili",23, 87));
Student("Jack",22, 87));
Student("LiLei",25, 95));
Student("Robin",32 ,99));
下面是我的代码:
  1. package test;

  2. import java.util.Comparator;
  3. import java.util.Iterator;
  4. import java.util.TreeSet;

  5. public class Test1
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 TreeSet set=new TreeSet(new MyComparator());
  10.                
  11.                 Student s1=new Student("Tom",24, 89);
  12.                 Student s2=new Student("Robin",32, 99);
  13.                 Student s3=new Student("Jerry",24, 99);
  14.                 Student s4=new Student("Lili",23, 87);
  15.                 Student s5=new Student("Jack",22, 87);
  16.                 Student s6=new Student("LiLei",25, 95);
  17.                 Student s7=new Student("Robin",32 ,99);
  18.                
  19.                 set.add(s1);
  20.                 set.add(s2);
  21.                 set.add(s3);
  22.                 set.add(s4);
  23.                 set.add(s5);
  24.                 set.add(s6);
  25.                 set.add(s7);
  26.                
  27.                 for(Iterator ite=set.iterator();ite.hasNext();)
  28.                 {
  29.                         Student s=(Student) ite.next();
  30.                         System.out.println("成绩:"+s.getScore()+"年龄:"+s.getAge()+"姓名:"+s.getName());
  31.                 }
  32.         }

  33. }

  34. class Student
  35. {
  36.         String name;
  37.         int age;
  38.         int score;

  39.         public Student(String name, int age, int score)
  40.         {
  41.                 this.age = age;
  42.                 this.name = name;
  43.                 this.score = score;
  44.         }

  45.         public String getName()
  46.         {
  47.                 return name;
  48.         }

  49.         public void setName(String name)
  50.         {
  51.                 this.name = name;
  52.         }

  53.         public int getAge()
  54.         {
  55.                 return age;
  56.         }

  57.         public void setAge(int age)
  58.         {
  59.                 this.age = age;
  60.         }

  61.         public int getScore()
  62.         {
  63.                 return score;
  64.         }

  65.         public void setScore(int score)
  66.         {
  67.                 this.score = score;
  68.         }
  69. }

  70. class MyComparator implements Comparator
  71. {

  72.         public int compare(Object o1, Object o2)
  73.         {
  74.                 Student s1 = (Student) o1;
  75.                 Student s2 = (Student) o2;

  76.                 String n1 = s1.getName();
  77.                 String n2 = s2.getName();
  78.                 int l=Math.max(n1.length(), n2.length());

  79.                 int a1 = s1.getAge();
  80.                 int a2 = s2.getAge();

  81.                 int sc1 = s1.getScore();
  82.                 int sc2 = s2.getScore();

  83.                 if (sc1 > sc2)
  84.                 {
  85.                         return -1;
  86.                 }
  87.                 else if (sc1 == sc2)
  88.                 {
  89.                         if (a1 > a2)
  90.                         {
  91.                                 return 1;
  92.                         }
  93.                         else if (a1 == a2)
  94.                         {
  95.                                 for (int i = 0; i < l-1; i++)
  96.                                 {
  97.                                         if (n1.charAt(i) > n2.charAt(i))
  98.                                         {
  99.                                                 return 1;
  100.                                         }
  101.                                         if (n1.charAt(i) == n2.charAt(i))
  102.                                         {
  103.                                                 return 0;
  104.                                         }
  105.                                         return -1;
  106.                                 }
  107.                         }
  108.                         return -1;
  109.                 }
  110.                 return 1;

  111.         }
  112. }
复制代码


就是判断姓名的时候那里只会循环一次,而且只会输出6个结果。这是为什么?
作者: csu050416    时间: 2015-5-16 13:26
  1. for (int i = 0; i < l-1; i++)
  2.                                {
  3.                                         if (n1.charAt(i) > n2.charAt(i))
  4.                                         {
  5.                                                 return 1;
  6.                                         }
  7.                                         if (n1.charAt(i) == n2.charAt(i))
  8.                                         {
  9.                                                 return 0;
  10.                                         }
  11.                                         return -1;
  12.                                 }
复制代码

作者: csu050416    时间: 2015-5-16 13:27
把这个改了直接用compareTo方法比较,return n1.compareTo(n2);你试下

作者: 嘎嘎鸭子    时间: 2015-5-16 13:34
把这个改了直接用compareTo方法比较,return n1.compareTo(n2);你试下
作者: 油炸电视剧    时间: 2015-5-16 13:36
csu050416 发表于 2015-5-16 13:27
把这个改了直接用compareTo方法比较,return n1.compareTo(n2);你试下

恩恩。行了,谢谢啊。我能不能问一下,我的代码的问题出现在哪啊。
作者: 懒儿想想    时间: 2015-5-16 22:39
好像是技术分的题呢
作者: 过路人    时间: 2015-5-16 23:17
int l=Math.mix(n1.length(), n2.length());这里应该以短的字符串长度为后面for循环结束条件,没看到你的运行结果,不明白你说的问题
作者: showdy    时间: 2015-5-17 14:51
实现comparator接口,一般写成匿名内部类要好些,可以参考下面代码:
  1. TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
  2.                         public int compare(Student s1, Student s2) {
  3.                                 int num = s1.getScore() - s2.getScore();
  4.                                 int num2 = (num == 0 ? s1.getAge() - s2.getAge() : num);
  5.                                 int num3 = (num2 == 0 ? s1.getName().compareTo(s2.getName())
  6.                                                 : num2);
  7.                                 return num3;
  8.                         }
  9.                 });
复制代码

作者: 油炸电视剧    时间: 2015-5-17 15:27
zhangkai986745 发表于 2015-5-16 23:23
代码重复量大了,可以简化一下

的确是重复量好大,毕竟新手,请见谅。
作者: 油炸电视剧    时间: 2015-5-17 15:36
showdy 发表于 2015-5-17 14:51
实现comparator接口,一般写成匿名内部类要好些,可以参考下面代码:

恩恩,参考了,谢谢,比我代码简洁多了。
作者: 雪风飞花    时间: 2015-5-17 15:49
你们讲这里是应该使用泛型了啊,怎么不见你用泛型啊,而且代码好复杂
作者: leeshaodong    时间: 2015-5-17 16:53
= = 瞬间躺了。用呢么多if判断,写的够长的。用comparator神马不是三言两语?
作者: 王英明    时间: 2015-5-17 17:29
呵呵,不明白!
作者: 鱼饵    时间: 2015-5-17 19:19
你的代码好长啊。
作者: 南朝小和尚    时间: 2015-5-17 20:17
菜鸟表示已经看蒙了。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2