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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 明天,你好 中级黑马   /  2013-5-13 22:00  /  1689 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘胜寒 于 2013-5-18 03:30 编辑

public class CompareByAge implements Comparator{

        
        public int compare(Object o1, Object o2) {
                Person p1=(Person)o1;
                Person p2=(Person)o2;
                if(p1.getAge()>p2.getAge())
                        return 1;
                else if(p1.getAge()<p2.getAge())
                        return -1;
                        else{
                                return p1.getAge()-p2.getAge();
                        }
        }
        
}
在主方法中调用这个方法,可以返回是按年龄大小排序,求高手解释是怎么实现的

点评

楼主我趁这黑夜给你结贴,希望楼主海涵。楼主问题解决了吧。 否则的话,接着让他未解决吧。。  发表于 2013-5-18 03:29

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 花开花落总相似 于 2013-5-13 22:16 编辑

是要解释这个方法还是什么?  是解释方法的话 就是这样了
public class CompareByAge implements Comparator{        //自定义一个比较方法    要想比较就需要有该对象有比较性 所以要继承这个 方法上面可以加泛型
        
        public int compare(Object o1, Object o2) {               // 覆写compare方法     
                Person p1=(Person)o1;                                       //如果不加泛型 这里建议判断一下类型
                Person p2=(Person)o2;
                if(p1.getAge()>p2.getAge())                         //这里就没什么好说的了 这个就是比较的书写
                        return 1;                                               //其中这里返回值 为 1 下面的 -1  是排序中按照返回值的正负来判断的  还有0
                else if(p1.getAge()<p2.getAge())
                        return -1;
                        else{
                                return p1.getAge()-p2.getAge();
                        }
        }
        
}

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
解释这个底层实现,大体的流程我也知道
回复 使用道具 举报
  1. TreeSet排序的第一种方式:
  2. 让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。也种方式也成为元素的自然顺序,或者叫做默认顺序。

  3. TreeSet的第二种排序方式。
  4. 当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。
  5. 在集合初始化时,就有了比较方式。
  6. 步骤:定义一个类,实现Compartor()接口,覆盖compare方法。把类对象作为初始值传给TreeSet集合的构造函数。
  7. 当两种排序都存在时,以比较器为主。(自几写的比较器为主,元素自带compareTo方法为次)
复制代码
代码示例如下:
  1. import java.util.*;
  2. class  TreeSetTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts=new TreeSet(new MyCompare());
  7.                 //ts.add(new Person("a"));
  8.                 ts.add(new Person("ab"));
  9.                 ts.add(new Person("ac"));
  10.                 ts.add(new Person("bbcd"));
  11.                 ts.add(new Person("abcd"));
  12.                 ts.add(new Person("adcde"));
  13.                 ts.add(new Person("acdef"));

  14.                 for(Iterator it=ts.iterator();it.hasNext();)
  15.                 {System.out.println(it.next());}


  16.                
  17.         }
  18. }

  19. class Person
  20. {
  21.         private String name;
  22.         Person(String name){
  23.         this.name=name;
  24.         }
  25.         public void setName(String name){
  26.         this.name=name;
  27.         }
  28.         public String  getName(){
  29.                 return name;
  30.         }
  31.         public String  toString(){
  32.         return name;}
  33. }

  34. class MyCompare implements Comparator
  35. {
  36.         public int compare(Object obj1,Object obj2){
  37.                 if(!(obj1 instanceof Person)&&(obj1 instanceof Person))
  38.                         throw new RuntimeException("不是学生对象");
  39.                 Person p1=(Person ) obj1;
  40.                 Person p2=(Person ) obj2;
  41.        
  42.                 int num=new Integer(p1.getName().length()).compareTo(new Integer(p2.getName().length()));
  43.                
  44.                 if(num ==0){
  45.                        
  46.                         return p1.getName().compareTo(p2.getName());
  47.                
  48.                 }
  49.                
  50.                 return num;

  51.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
本帖最后由 花开花落总相似 于 2013-5-13 22:25 编辑
明天,你好 发表于 2013-5-13 22:15
解释这个底层实现,大体的流程我也知道


TreeSet是一个有序集合,里面的元素若要实现自然排序就需要实现Comparable接口,或者你也可以自定义一个Comparator实现自己的比较方式。TreeSet底层无非是通过比较元素实现排序,那也是调用Comparable或者Comparator来实现的。  其实你可以在覆写的 他的比较方法时候加一个比较方法的输出语句 试试看


import java.util.*;
public class TestTreeObject{
public static void main(String[]args){
  TreeSet <String> ts = new TreeSet <String> (new bijiao());
  ts.add("adfgewgsa");
  ts.add("adfgewsdsgsa");
  ts.add("adfgesdfewwgsa");
  ts.add("adfgewsdfgsa");
  ts.add("adfgesdafewrwgsa");
  //ts.add(4546);
  Iterator it = ts.iterator();
  while(it.hasNext()){
   output(it.next());
  }
}
public static void output(Object obj){
  System.out.println(obj);
}
}
class bijiao implements Comparator{

public  int compare(Object obj1,Object obj2){
  String s1 = (String)obj1;
  String s2 = (String)obj2;
  System.out.println("显示");            //这里加个输出语句  你可以看到TreeSet 集合在排序是调用该方法的时候
  return s1.length()-s2.length();
  
}
}

评分

参与人数 1技术分 +1 收起 理由
Sword + 1 注意以后点击“&lt;&gt;”插入代码.

查看全部评分

回复 使用道具 举报
如果问题解决,及时结贴。。把未解决变成以解决
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马