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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 于汝国 于 2011-12-23 10:09 编辑

对于一个普通的类,除了实现Comparable接口外,还可以通过什么方法能够对其进行排序?最好有代码实例......

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

9 个回复

倒序浏览
应该是没有了吧,一个类实现了Comparable接口,就是给一个本来不具备排序的类实现了一个可排序的功能。
实现了Comparable接口之后可以自定义比较器或是采用默认的字典顺序进行排序。
回复 使用道具 举报
在HashSet中Comparable接口并不能使用,那HashSet是如何去掉重复的元素的呢?
回复 使用道具 举报
于汝国 发表于 2011-12-22 19:39
在HashSet中Comparable接口并不能使用,那HashSet是如何去掉重复的元素的呢?

可以添加类的equals方法去覆盖Object的equals方法.
  1. class   MyObject{
  2.     int   i;
  3.     String   s;
  4.     MyObject(int   i,String   s){
  5.       this.i=i;
  6.       this.s=s;
  7.   }

  8.   public   int   hashCode()   {
  9.       return   s.hashCode();
  10.   }

  11.   public   boolean   equals(Object   o)   {
  12.       if(o==null   ||!(   o   instanceof   MyObject)){
  13.           return   false;
  14.       }
  15.       MyObject   ob=(MyObject)o;
  16.       return   s.equals(ob.s)&&i==ob.i;
  17.   }
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
于汝国 发表于 2011-12-22 19:39
在HashSet中Comparable接口并不能使用,那HashSet是如何去掉重复的元素的呢?

重写hashCode()方法和equals()方法。
回复 使用道具 举报
谢谢!通过hashCode()和equals()可以搞定,是吧!那我自己写个Person类搞搞……
回复 使用道具 举报
曾运 黑马帝 2011-12-22 21:03:46
7#
实现Comparable接口是让类具有了排序功能
也可以自定义比较器(通过实现Comparator接口)让集合具有排序功能(通过集合的构造函数传入)
  1. /*
  2. 实现Comparator接口,自定义一个比较器,让容器具有比较功能, 实现容器内存放元素排序
  3. 1.
  4.   TreeSet 集合中靠比较器的 compareTo 或者compare 方法返回值的情况保证元素的唯一性
  5.   返回是0的话,则元素重复,不添加到集合容器中
  6.   
  7.   2.如果同时使用了两个比较器,那么使用的是外部比较器(实现了Comparetor接口的比较器)
  8.   */
  9. package com.zengyun;

  10. import java.util.Comparator;
  11. import java.util.TreeSet;

  12. public class ComparatorDemo
  13. {

  14.         public static void main(String[] args)
  15.         {
  16.                 TreeSet<Person> ts=new TreeSet<Person>(new MyComparator());//构造函数传入比较器
  17.                 Person p1=new Person("abc",23);
  18.                 Person p2=new Person("abc",24);
  19.                 Person p3=new Person("abc",20);
  20.                 Person p4=new Person("ebc",19);
  21.                 Person p5=new Person("eec",22);
  22.                 Person p6=new Person("abc",24);
  23.                
  24.                
  25.                 ts.add(p1);
  26.                 ts.add(p2);
  27.                 ts.add(p3);
  28.                 ts.add(p4);
  29.                 ts.add(p5);
  30.                
  31.                 //输出容器内的元素
  32.                 for(Person p:ts)
  33.                 {
  34.                         System.out.println(p);
  35.                 }

  36.         }

  37. }


  38. class MyComparator implements Comparator<Person>
  39. {
  40.         public int compare(Person p1,Person p2)
  41.         {   
  42.                 //先按年龄排序
  43.                 if(p1.getAge()>p2.getAge())
  44.                         return 1;
  45.                 if(p1.getAge()<p2.getAge())
  46.                         return -1;
  47.                
  48.                 //再按名字排序
  49.                 if(p1.getName().compareTo(p2.getName())>0)
  50.                         return 1;
  51.                 if(p1.getName().compareTo(p2.getName())<0)
  52.                         return -1;
  53.                
  54.                    return 0;
  55.         }
  56.        
  57.        
  58.        
  59. }



  60. class Person implements Comparable<Person>
  61. {
  62.         private String name;
  63.         private int age;
  64.         Person(String name,int age)
  65.         {
  66.           this.name=name;
  67.           this.age=age;
  68.         }
  69.        
  70.         public void setName(String name)
  71.         {
  72.          this.name=name;
  73.         }
  74.        
  75.         public String getName()
  76.         {
  77.                 return this.name;
  78.         }
  79.        
  80.        
  81.         public void setAge(int age)
  82.         {
  83.                 this.age=age;
  84.         }
  85.        
  86.         public int getAge()
  87.         {
  88.                 return this.age;
  89.         }
  90.         public int compareTo(Person p)
  91.         {   
  92.                 //先按照姓名升序排序
  93.                 if(this.name.compareTo(p.getName())>0)
  94.                         return 1;
  95.                 if(this.name.compareTo(p.getName())<0)
  96.                         return -1;
  97.                 //再按照年龄升序排序
  98.                 if(this.age>p.getAge())
  99.                         return 1;
  100.                 if(this.age<p.getAge())
  101.                         return -1;
  102.                 return 0;
  103.                
  104.         }
  105.        
  106.         @Override
  107.         public int hashCode()
  108.         {   
  109.                 System.out.println("hashCode.....");
  110.                 int result;
  111.                 result=(name==null)?0:this.name.hashCode();
  112.                 return result+age*13;
  113.         }
  114.        
  115.         @Override
  116.         public boolean equals(Object o)
  117.         {   
  118.                 System.out.println("equals()......");
  119.                 if(this==o)
  120.                         return true;
  121.                
  122.                 if(!(o instanceof Person))
  123.                         return false;
  124.                 Person p=(Person)o;
  125.                 if(this.getName().equals(p.getName())&&this.getAge()==p.getAge())
  126.                         return true;
  127.                
  128.                 return false;
  129.         }
  130.        
  131.         public String toString()
  132.         {
  133.                 return "姓名:"+this.name+"\t"+"年龄:"+this.age;
  134.         }
  135.        
  136. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
于汝国 黑马帝 2011-12-22 21:32:47
8#
谢谢大家哈!这回我明白了!有两种方法可以解决,嘻嘻!
回复 使用道具 举报
奔→跑 黑马帝 2011-12-22 21:53:37
9#
让比较器具备比较性。

实现comparetor并覆盖compare方法;
回复 使用道具 举报
其实就是楼主自己定义两个类怎么比较大小,比如按按类的某1(几)个域的大小,按类的hashcode等等,反正按你需要自己定义,想通了就简单得很

import   java.util.*;
public   class   CompType   implements   Comparable{
int   i;
int   j;
public   CompType(int   n1,int   n2){
i   =   n1;
j   =   n2;
}
public   String   toString(){
return   "[i   =   "+i+ ",   j   =   "+j+ "] ";
}
public   int   compareTo(Object   rv){
int   rvi   =   ((CompType)rv).i;
int   rvj   =   ((CompType)rv).j;
return   (i <rvi   ?   -1   :   (i==rvi   ?   0:1));
}
}
这个就是只比较第一个元素的大小!

/**
      @version   1.30   2004-02-27
      @author   Cay   Horstmann
*/

import   java.util.*;

public   class   EmployeeSortTest
{     
      public   static   void   main(String[]   args)
      {     
            Employee[]   staff   =   new   Employee[3];

            staff[0]   =   new   Employee( "Harry   Hacker ",   35000);
            staff[1]   =   new   Employee( "Carl   Cracker ",   75000);
            staff[2]   =   new   Employee( "Tony   Tester ",   38000);

            Arrays.sort(staff);

            //   print   out   information   about   all   Employee   objects
            for   (int   i   =   0;i <staff.length;i++)
            {
                  Employee   e=staff[i];
                  System.out.println( "name= "   +   e.getName()   +   ",salary= "   +   e.getSalary());
            }
      }
}

class   Employee   implements   Comparable
{     
      public   Employee(String   n,   double   s)
      {     
            name   =   n;
            salary   =   s;
      }

      public   String   getName()
      {     
            return   name;
      }

      public   double   getSalary()
      {     
            return   salary;
      }

      public   void   raiseSalary(double   byPercent)
      {     
            double   raise   =   salary   *   byPercent   /   100;
            salary   +=   raise;
      }

      public   int   compareTo(Object   otherObject)
      {     
          Employee   other   =   (Employee)otherObject;
            if   (salary   <   other.salary)   return   -1;
            if   (salary   >   other.salary)   return   1;
            return   0;
      }

      private   String   name;
      private   double   salary;
}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马