`

比较器Comparable和Comparator

    博客分类:
  • JAVA
 
阅读更多

Comparable接口

可以直接使用java.util.Arrays 类进行数组的排序操作,但对象所在的类必须实现Comparable 接口,用于指定排序接口。

Comparable 接口定义如下:

public interface Comparable<T>{

public int compareTo(T o);

}

此方法返回一个int 类型的数据,但是此int 的值只能是以下三种:

1:表示大于

-1:表示小于

0:表示相等

要求:定义一个学生类,里面有姓名、年龄、成绩三个属性,要求按成绩由高到低排序,如果成绩相等,则按照年龄由低到高排序。

import java.util.Arrays;

class Student implements Comparable<Student> {	// 指定类型为Student
	
	private String name ;
	private int age ;
	private float score ;
	
	public Student(String name,int age,float score){
		this.name = name ;
		this.age = age ;
		this.score = score ;
	}
	
	public String toString(){
		return name + "\t\t" + this.age + "\t\t" + this.score ;
	}
	
	public int compareTo(Student stu){	// 覆写compareTo()方法,实现排序规则的应用
		if(this.score>stu.score){
			return -1 ;
		}else if(this.score<stu.score){
			return 1 ;
		}else{
			if(this.age>stu.age){
				return 1 ;
			}else if(this.age<stu.age){
				return -1 ;
			}else{
				return 0 ;
			}
		}	
	}
}

public class ComparableDemo1{
	public static void main(String args[]){
		Student stu[] = {new Student("张三",20,90.0f),
			new Student("李四",22,90.0f),new Student("王五",20,99.0f),
			new Student("赵六",20,70.0f),new Student("孙七",22,100.0f)} ;
		
		Arrays.sort(stu) ;	// 进行排序操作
		System.out.println("姓名" + "\t\t" + "年龄" + "\t\t" + "成绩");
		
		for(int i=0;i<stu.length;i++){	// 循环输出数组中的内容
			System.out.println(stu[i]) ;
		}
	}
}

 输出结果:

姓名  年龄  成绩
孙七  22  100.0
王五  20  99.0
张三  20  90.0
李四  22  90.0
赵六  20  70.0

 

另一种比较器:Comparator

 

如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作。为了解决这样的问题,java又定义了另一个比较器的操作接口——Comparator。

此接口定义在java.util 包中,接口定义如下:

public interface Comparator<T>{

public int compare(T o1, T o2);

boolean equals(Object obj);

}

下面定义一个自己的类,此类没有实现Comparable接口。

import java.util.* ;

//指定类型为Student
class Student{	
	private String name ;
	private int age ;
	
	public Student(String name,int age){
		this.name = name ;
		this.age = age ;
	}
	
	public boolean equals(Object obj){	// 覆写equals方法
		if(this==obj){
			return true ;
		}
		if(!(obj instanceof Student)){
			return false ;
		}
		Student stu = (Student) obj ;
		if(stu.name.equals(this.name)&&stu.age==this.age){
			return true ;
		}else{
			return false ;
		}
	}
	public void setName(String name){
		this.name = name ;
	}
	public void setAge(int age){
		this.age = age ;
	}
	public String getName(){
		return this.name ;
	}
	public int getAge(){
		return this.age ;
	}
	public String toString(){
		return name + "\t\t" + this.age  ;
	}
}

//实现比较器
class StudentComparator implements Comparator<Student>{	
	// 因为Object类中本身已经有了equals()方法
	public int compare(Student s1,Student s2){
		if(s1.equals(s2)){
			return 0 ;
		}else if(s1.getAge()>s2.getAge()){	// 按年龄比较,由低到高
			return 1 ;
		}else{
			return -1 ;
		}
	}
}

public class ComparatorDemo{
	public static void main(String args[]){
		Student stu[] = {new Student("张三",20),
			new Student("李四",22),new Student("王五",20),
			new Student("赵六",20),new Student("孙七",22)} ;
		
		Arrays.sort(stu,new StudentComparator()) ;	// 进行排序操作
		System.out.println("姓名" + "\t\t" + "年龄");
		for(int i=0;i<stu.length;i++){	// 循环输出数组中的内容
			System.out.println(stu[i]) ;
		}
	}
}

 输出结果:

姓名		年龄
张三		20
王五		20
赵六		20
李四		22
孙七		22

 总结:在使用中,尽可以还是用Comparable ,在需要排序的类上实现好此接口,而Comparator 需要单独建立一个排序的类,这样如果有很多的话,则排序的规则类也就会非常多,操作起来比较麻烦。

分享到:
评论

相关推荐

    java中Comparable和Comparator的区别

    在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用场景和特点。本文将深入探讨这两个接口的区别,以及它们在实际开发中的应用。 首先,我们来了解一下...

    Comparable&Comparator区别

    - `boolean equals(Object obj)`: 此方法用于判断比较器是否等于另一个对象。这在某些情况下可能有用,尤其是在实现自定义排序算法时。 ##### 3. 实现案例 以下是一个实现`Comparator`接口的例子: ```java ...

    Comparable接口和Comparator使用示例

    与 Comparable 接口不同,Comparator 是一个外部比较器,它可以独立于被比较的对象。 在上面的示例代码中,我们定义了一个 CompareTest 类,该类实现了 Comparator 接口。CompareTest 类用于比较两个 Simple 对象的...

    Comparable和Comparator区分1

    Comparator是一个独立于待排序对象的比较器,它不修改待排序类的源代码,而是提供了一个独立的比较逻辑。我们创建一个PersonComparator类,实现Comparator接口: ```java public class PersonComparator implements...

    详解Java中Comparable和Comparator接口的区别

    两者之间的主要区别在于,Comparable 是一个内部比较器,而 Comparator 是一个外部比较器。一个类实现了 Comparable 接口,那么它就支持排序,而不需要外部比较器。另一方面,如果一个类不支持排序,我们可以通过...

    Java中Comparable和Comparator 2种实现方式学习

    总的来说,`Comparable`和`Comparator`都是实现对象比较和排序的重要工具。`Comparable`适用于类自身需要具备比较能力的情况,而`Comparator`则更适合于外部实体根据特定需求进行比较的场景。两者结合使用可以提供极...

    比较器(Comparable、Comparator)

    NULL 博文链接:https://chaoyi.iteye.com/blog/2082723

    对比Java中的Comparable排序接口和Comparator比较器接口

    Comparator是一个比较器接口,它提供了一种在类本身不支持排序的情况下控制对象次序的方式。通过实现Comparator接口,你可以创建一个独立于原始类的比较逻辑,这使得排序更灵活。Comparator接口包含两个方法:`...

    Java Comparable和Comparator对比详解

    例如,下面是一个实现 Comparator 接口的整数比较器,根据整数的大小进行降序排序: ```java import java.util.*; public class CompareController1 implements Comparator&lt;Integer&gt; { @Override public int ...

    Comparable与Comparator的区别

    Comparator接口位于`java.util`包下,用于提供一种外部比较的方式,即不改变对象本身,而是通过一个专门的比较器对象来决定两个对象的大小关系。这种设计模式被称为策略模式,它可以灵活地改变对象的排序策略。 当...

    java排序Comparator和Comparable

    在Java编程语言中,排序是数据处理中一个非常常见的需求,...`Comparator`则是外部比较器,可以动态调整排序规则,适用于各种复杂的排序场景。了解并熟练掌握这两个接口的使用,将有助于提升Java编程中的数据处理能力。

    Comparable与Comparator的区别Java开

    2. **实现方式**:`Comparable`是通过类实现接口,而`Comparator`是在排序时创建和传递一个新的比较器实例。 3. **通用性**:`Comparator`更通用,可以用于任何类型的对象,而`Comparable`通常与特定类绑定。 4. **...

    java 中Comparable与Comparator详解与比较

    当一个类实现了Comparable接口,意味着类的实例可以被自然排序,无需额外的比较器。例如,String类就实现了Comparable接口,可以直接进行字符串比较。如果有一个自定义类,如Person1,实现了Comparable接口,那么它...

    ComparatorAndComparable

    教你学会Comparator和Comparable

    Java Comparable及Comparator接口区别详解

    Java Comparable及Comparator接口区别...Comparable 接口需要类自己实现 compareTo 方法,而 Comparator 接口需要单独定义一个比较器实现 compare 方法。Comparator 接口相对于 Comparable 来说更加灵活,耦合度低。

    List对象集合的排序:比较器Comparator(简单例子)

    `Comparator`接口位于`java.util`包中,它包含了一个方法`compare(T o1, T o2)`,这个方法需要比较两个类型为T的对象o1和o2,并返回一个整数值。根据返回值的不同,我们可以判断o1和o2的相对大小: - 如果`compare...

    DynamicComparator:Java 动态比较器

    在Java编程语言中,`DynamicComparator`是一种实现比较器(Comparator)的方式,它允许在运行时根据特定条件来比较对象。这种技术对于处理多种比较逻辑或者需要灵活改变比较规则的场景非常有用。本文将深入探讨Java...

    浅析Java中comparator接口与Comparable接口的区别

    Comparator接口则提供了更大的灵活性,你可以根据需要创建多个比较器,这在处理复杂数据结构或需要多标准比较时非常有用。然而,缺点是每次排序都需要提供额外的比较器实例,代码可能会变得更冗余。 在实际应用中,...

    comparable和compartor区别

    `Comparator`接口提供了更加灵活的比较方式,它允许我们在外部定义一个比较器,从而可以根据需要改变对象之间的比较逻辑。这种方式通常用于临时排序需求,或者当对象自身不支持特定的排序规则时。 **1. Comparator...

Global site tag (gtag.js) - Google Analytics