Java中Comparator和Comparabler的区别

1. Comparator 和 Comparable 相同之处

都是java的一个接口,用来对自定义class的类进行比较

2. Comparator 和 Comparable 的区别


Comparable 定义在 Person类的内部:                                  

public class Person implements Comparable<Person>{..比较Person的大小..}

利用Collections.sort(personList)可以得到正确的结果。


Comparator 定义在Person的外部

Person类的结构不需要有任何变化,如public class Person{ String name; int age}

另外定义一个比较器public PersonComparator implements Comparator<Person> {..比较Person的大小..}

利用Collections.sort( personList , new PersonComparator() )可以得到正确的结果。

3. Comparator 和 Comparable 的实例

Comparator实例:
package com.test;

import java.util.*;//util全称utility工具

/**
* 对Person集合类按名字排序,若名字相同则按年龄大小排序 
*/
public class test
{
	
	public static class Person //定义Person类
	{
		
	    private String name; //名字
	    private int age; //年龄
	    
	    public Person(String name, int age) //带两个参数的构造函数
	    {
	    	this.name = name;
	    	this.age = age;
	    }
	    
	    public String getName() //获得名字
	    {
	    	return this.name;
	    }
	    
	    public int getAge() //获得年龄
	    {
	    	return this.age;
	    }
	    
	    public String toString() //为了输出方便,重写了toString()   
        {  
            return getName() +" " + getAge();  
        } 
	    
	}
	//定义比较器
	public static class PersonComparator implements Comparator<Person> 
	{ 
		
	    public int compare(Person one, Person another)
	    {
	         int i = 0;
	         i = one.getName().compareTo(another.getName()); // 使用字符串的比较
	         
	         if(i == 0)
	         { // 如果名字一样,比较年龄,返回比较年龄结果
	              return one.getAge() - another.getAge();
	         } 
	         else 
	         {
	              return i; // 名字不一样, 返回比较名字的结果.
	         }
	    }
	}
	public static void main(String[] args)
	{
		
		Person[] PersonSet = new Person[]{new Person("zhangsan", 40), new Person("zhangsan", 30), new Person("lisi", 20), new Person("wangwu", 50)};
		List<Person> personList = new ArrayList<Person>(); //定义一个 personList (集合)动态数组
		personList.add(PersonSet[0]);//添加元素
		personList.add(PersonSet[1]);
		personList.add(PersonSet[2]);
		personList.add(PersonSet[3]);
		System.out.println("Person排序前:");
		for(int i = 0;i < personList.size();i++)
		{ 
			System.out.println(personList.get(i)); 
		} 
		Collections.sort( personList , new PersonComparator()); //对personList集合(动态数组)进行排序
		
		//遍历personList中的元素 
		System.out.println("Person排序后:");
		for(int i = 0;i < personList.size();i++)
		{ 
			System.out.println(personList.get(i)); 
		} 
	} 
} 

运行结果:

Person排序前:
zhangsan 40
zhangsan 30
lisi 20
wangwu 50
Person排序后:
lisi 20
wangwu 50
zhangsan 30
zhangsan 40

Comparable实例:
package com.test;

import java.util.*;//util全称utility工具

/**
* 对Person集合类按名字排序,若名字相同则按年龄大小排序 
*/
public class test
{
	
	public static class Person implements Comparable<Person> //定义Person类
	{
		
	    private String name; //名字
	    private int age; //年龄
	    
	    public Person(String name, int age) //带两个参数的构造函数
	    {
	    	this.name = name;
	    	this.age = age;
	    }
	    
	    public int compareTo (Person another)
	    {
	    	int i = 0;
	    	i = name.compareTo(another.name);
	        if(i == 0) // 如果名字一样,比较年龄, 返回比较年龄结果
	        {   
	              return age - another.age;  
	        } 
	        else // 名字不一样, 返回比较名字的结果.
	        {  
	              return i; // 名字不一样, 返回比较名字的结果.  
	        }  
	    }
	    
	    public String toString() //为了输出方便,重写了toString()   
        {  
            return name +" " + age;  
        } 
	    
	}
	
	public static void main(String[] args)
	{
		
		Person[] PersonSet = new Person[]{new Person("zhangsan", 40), new Person("zhangsan", 30), new Person("lisi", 20), new Person("wangwu", 50)};
		List<Person> personList = new ArrayList<Person>(); //定义一个 personList (集合)动态数组
		personList.add(PersonSet[0]);//添加元素
		personList.add(PersonSet[1]);
		personList.add(PersonSet[2]);
		personList.add(PersonSet[3]);
		System.out.println("Person排序前:");
		for(int i = 0;i < personList.size();i++)
		{ 
			System.out.println(personList.get(i)); 
		} 

		Collections.sort( personList);	<span style="font-family: Arial, Helvetica, sans-serif;">//对personList集合(动态数组)进行排序</span><span style="font-family: Arial, Helvetica, sans-serif;">	</span>
		//遍历personList中的元素 
		System.out.println("Person排序后:");
		for(int i = 0;i < personList.size();i++)
		{ 
			System.out.println(personList.get(i)); 
		} 
	} 
} 

运行结果:

Person排序前:
zhangsan 40
zhangsan 30
lisi 20
wangwu 50
Person排序后:
lisi 20
wangwu 50
zhangsan 30
zhangsan 40



参考文章:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值