`

java中comparator与comparable的解析

阅读更多
java中comparator与comparable的解析
一.comparable与comparator的不同点
1.首先comparable是在java.lang包下的接口,而comparator是java.util包下的接口。
2.类实现comparable接口后需要实现下面的方法:
	
public int compareTo(T o) {
		// TODO Auto-generated method stub
	
		return 0  ;
	}

而实现Comparator的类,测需要实现下面的方法:
		
public int compare(Object o1, Objecto2) {
			// TODO Auto-generated method stub	

		return 0;
		}

3.实现comparable的接口的类,它的对象就可以进行自比较,通过Arrays.sort()或Collections.sort()就可以对包含此对象的数组或集合进行排序。看下面例子:
首先,先定义一个Person类,实现Comparable接口,我们以年龄作为排序的依据:
public class Person<T> implements Comparable<T> {

	private String name;
	
	private String sex;	
        
         private int age;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Person(String name, String sex, int age) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int compareTo(T o) {
		// TODO Auto-generated method stub
		
		return ((Person)o).getAge() - this.age  ;
	}

}

然后,定义一个测试类,如下:
public class TestCompare {

	public static void main(String[] args){
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Person("a","male",1);
		Person p2 = new Person("b","female",2);
		Person p3 = new Person("c","male",3);
		
		list.add(p3);
		list.add(p1);
		list.add(p2);
		
		Collections.sort(list);
		
		for(Person p:list){
			System.out.println("Name: " + p.getName() + "  "
					+ "Sex: " + p.getSex() + "  " + "Age: " + p.getAge());
		}		
	
}

输出结果为:

    Name: c  Sex: male  Age: 3
    Name: b  Sex: female  Age: 2
    Name: a  Sex: male  Age: 1

这是是降序排列,把compareTo中的方法做如下改动,就变成升序排列了。
	
	public int compareTo(T o) {
		// TODO Auto-generated method stub
		
		return this.age - ((Person)o).getAge() ;
	}

4.有时类并没有实现comparable接口,而我们又需要对包含此类对象的数组或集合进行排序,那么我们就需要实现Comparator这个比较器了。新建一个person类:
public class Person<T> {

	private String name;
	
	private String sex;
	
	private int age;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Person(String name, String sex, int age) {
		super();
		this.name = name;
		this.sex = sex;
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}

再定义一个测试类:
public class TestCompare {

	public static void main(String[] args){
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Person("a","male",1);
		Person p2 = new Person("b","female",2);
		Person p3 = new Person("c","male",3);
		
		list.add(p3);
		list.add(p1);
		list.add(p2);
		
		Collections.sort(list , emCpmpare);
		
		for(Person p:list){
			System.out.println("Name: " + p.getName() + "  "
					+ "Sex: " + p.getSex() + "  " + "Age: " + p.getAge());
		}
	}
	
	public static Comparator<Person> emCpmpare = new Comparator<Person>(){

		@Override
		public int compare(Person o1, Person o2) {
			// TODO Auto-generated method stub
			String name1 = ((Person)o1).getName();
			String name2 = ((Person)o2).getName();
			if(!name1.isEmpty() && !name2.isEmpty())
				return name1.compareTo(name2);
			else {
				int age1 = ((Person)o1).getAge();
				int age2 = ((Person)o2).getAge();
				return age1 - age2;
			}
		}
		
	};
	
	
}

这样就可以实现person的排序了。
分享到:
评论

相关推荐

    Comparable&Comparator区别

    在Java编程中,为了对自定义对象进行排序,Java提供了两种接口:`Comparable`与`Comparator`。这两种接口各有优势,适用于不同的场景。本文将深入探讨这两种接口的区别及其应用场景,帮助读者更好地理解它们的工作...

    Java 比较接口comparable与comparator区别解析

    Java 比较接口comparable与comparator区别解析 Java 语言中提供了两个比较接口: Comparable 和 Comparator,这两个接口都是用于比较对象的大小顺序的,但它们有着不同的使用场景和实现方式。在本文中,我们将详细...

    Java语言实践教学解析.zip

    4.3 排序与比较:掌握Collections.sort()方法,理解Comparator和Comparable接口。 五、输入/输出流 5.1 文件操作:学习如何读写文件,理解File类的使用。 5.2 流的概念:掌握InputStream、OutputStream、Reader、...

    JAVA 对象数组按照多个属性进行排序

    首先,了解Java中的`Comparable`和`Comparator`接口。`Comparable`是对象自身具备比较能力的接口,它定义了一个`compareTo()`方法,用于比较对象的自然顺序。而`Comparator`则是一个可以比较任何两个对象的接口,它...

    4-java常用API进阶类1

    在Java编程中,了解和熟练使用常用API是非常重要的。本文将深入探讨Java中的日期时间API、字符串转换、包装类以及比较器等相关知识点。 首先,我们来看日期时间API。在Java中,日期时间的处理经历了多次演变。早期...

    JAVA-V2-Interfaces-Comparable-y-Comparator

    在Java编程语言中,`Comparable`和`Comparator`接口是两个非常重要的概念,它们主要用于对象的排序和比较。本文将详细解析这两个接口的工作原理、使用场景以及如何在实际开发中应用。 首先,`Comparable`接口位于`...

    Java List集合排序实现方法解析

    本文详细介绍了 Java List 集合排序实现方法解析,包括使用 Collections 工具类中的 sort() 方法、使用 Comparable 接口和使用 Comparator 接口等多种方法。通过这些方法,我们可以轻松地对 List 集合进行排序,以便...

    能让你成为一个优秀的 Java 全栈程序员的系统化系列教程

    Comparable 和 Comparator的理解 并发系列: JSR-133 都解决了哪些问题 简单认识并发 看完你就明白的锁系列之锁的状态 看完你就明白的锁系列之乐观锁和悲观锁 看完你就明白的锁系列之自旋锁 锁系列汇总 并发编程...

    java高级面试题汇总

    本资源摘要信息中,我们将对 Java 高级面试题进行总结和分析,涵盖了 Java 面试题的方方面面,从数据类型转换到框架选择,从线程池状态到 Java 8 的元空间替换,从跳出多重循环到 JSON 对象解析,从 Comparable 和 ...

    Java常用Util类Jar

    5. **Comparator与Comparable**:`Comparable`接口用于对象的自然排序,`Comparator`接口则允许自定义比较逻辑,常用于排序或过滤操作。 6. **Random类**:提供随机数生成,可用于游戏、模拟或其他需要随机数据的...

    java-GenericSort-源码.rar

    《Java泛型排序算法解析与实现》 在Java编程中,泛型(Generic)和排序(Sort)是两个非常重要的概念。泛型提供了一种在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。而排序则是...

    Java语言程序设计与数据结构(基础篇)第9章课后习题代码chapter9.rar

    - **Comparable与Comparator**:用于对象比较排序,Comparable定义自然顺序,Comparator自定义比较规则。 - **List, Set, Queue等接口**:定义了各种数据结构的行为规范。 7. **文件与I/O流**: - 文件操作:...

    笔试Java1.doc

    在COLLECTION 框架中,实现比较需要实现Comparable 接口和 Comparator 接口。 12. String 和 StringBuffer 的区别 知识点:String 和 StringBuffer 的区别 String 是不可变字符串,而StringBuffer 是可变字符串。

    java javascript good thing

    在Java中,我们可以实现Comparable接口或使用Comparator接口来比较对象。自定义比较器对于那些需要根据特定字段或逻辑进行排序的情况非常有用。 2. **XML Encode/Decode**: "xml encode decode"标签暗示了存在...

    JAVA 综合面试题

    在Java集合框架中,如果要实现自定义的比较逻辑,通常需要实现`Comparable`接口或`Comparator`接口。`Comparable`接口用于自然排序,需要在类中实现`compareTo()`方法。`Comparator`接口用于外部排序,可以独立于类...

    java面试题目 题库

    4. **集合框架**:面试题目整理-service.docx可能会涉及ArrayList、LinkedList、HashMap、HashSet等集合类的特性、操作和使用场景,以及泛型、迭代器、Comparable与Comparator接口的应用。 5. **多线程**:Java提供...

    实验二、Java集合与XML实验.doc

    在实验中,你可能需要使用Java的JAXB(Java Architecture for XML Binding)或DOM4J等库来解析和生成XML文档。例如,使用JAXB将Java对象转换为XML: ```java import javax.xml.bind.JAXBContext; import javax.xml....

Global site tag (gtag.js) - Google Analytics