`
Javaloverlover
  • 浏览: 347088 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

求解Comparator和Comparable

    博客分类:
  • java
阅读更多
Comparator接口,实现此接口的类就是一个排序器,Arrays和Collections都能在sort()方法的参数中指明排序方式,即实现Comparator接口的类的示例。
User类:

public class User {

	private String name;
	private int age;
	
	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

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

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

}

ComparatorUser类;
import java.util.Arrays;
import java.util.Comparator;

public class ComparatorUser implements Comparator<User> {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User[] users = new User[] { new User("1", 15), new User("2", 19), new User("3", 17) };
		for(User user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
		Arrays.sort(users, new ComparatorUser());
		for(User user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
		
	}

	@Override
	public int compare(User user1, User user2) {
		return ((User) user1).getAge() - ((User) user2).getAge();
	}


}

结果:
1:15
2:19
3:17
1:15
3:17
2:19


这里的ComparatorUser就是一个排序器。只不过我将测试代码写在此类里边了。
写在外边的情况,User类不变,
ComparatorUser类:
import java.util.Comparator;

public class ComparatorUser implements Comparator<User> {

	@Override
	public int compare(User user1, User user2) {
		return ((User) user1).getAge() - ((User) user2).getAge();
	}

}

测试类:
import java.util.Arrays;

public class ComparatorTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		User[] users = new User[] { new User("jin", 18),
				new User("gui", 19), new User("jin", 15),
				new User("chao", 20) };
		for(User user : users) {
			System.out.println(user.getName() + ": " + user.getAge());
		}
		Arrays.sort(users, new ComparatorUser());
		for(User user : users) {
			System.out.println(user.getName() + ": " + user.getAge());
		}
	}

}

输出结果:
jin: 18
gui: 19
jin: 15
chao: 20
jin: 15
jin: 18
gui: 19
chao: 20




实现Comparable接口的类在进行排序时,就会默认对其用自身的排序机制进行排序。
import java.util.Arrays;


public class ComparableUser implements Comparable<ComparableUser> {
	
	private String name;
	private int age;
	
	public ComparableUser(String name, int age) {
		this.age = age;
		this.name = name;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

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

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ComparableUser[] users = new ComparableUser[] { new ComparableUser("jin", 15), new ComparableUser("gui", 19), new ComparableUser("chao", 18), new ComparableUser("jin", 17) };
		for(ComparableUser user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
		Arrays.sort(users);
		for(ComparableUser user : users) {
			System.out.println(user.getName() + ":" + user.getAge());
		}
	}

	@Override
	public int compareTo(ComparableUser user) {
		if(this.name.compareTo(user.getName()) != 0) {
			return this.name.compareTo(user.getName());
		}
		return this.age - user.age;
	}

}

结果:
jin:15
gui:19
chao:18
jin:17
chao:18
gui:19
jin:15
jin:17


总结:
Comparator是排序器,是一种规则,
实现Comparable接口,就说明,某个类有自己定义的排序规则。
如果对已经实现Comparable的类进行指定排序器的话,编译就会出错。
分享到:
评论

相关推荐

    常见算法(C,java两种实现代码)

    C和Java都有相应的实现,例如,快速排序在C中的实现可能涉及递归和指针操作,而在Java中,我们可以利用内置的Comparable接口或Comparator接口进行排序。 2. **查找算法**:查找算法帮助我们在数据集中找到特定元素...

    数据结构和算法,数据结构和算法,数据结构和算法

    - 了解Java中的Comparable和Comparator接口,用于自定义排序规则。 - Java的并发库如ConcurrentHashMap,适用于多线程环境下的数据结构操作。 通过深入学习数据结构和算法,可以提升编程能力,解决复杂问题,并为...

    Java数据结构和算法 (第二版).rar

    - **接口与类的使用**:如Comparable和Comparator接口,用于定制比较逻辑。 - **多线程与并发**:在数据结构和算法中,如何处理线程安全和并发访问问题。 - **异常处理**:在实现过程中,如何正确处理可能出现的...

    Java和C语言实现各种经典算法(含代码图例)

    这些排序算法是数据处理的基础,Java中的Arrays类提供了排序接口,而自定义排序则可以通过Comparable或Comparator接口实现。 2. **查找算法**:如二分查找、哈希查找。二分查找在有序数组中效率很高,而哈希表则能...

    java最接近点对问题

    这一步可以通过实现`Comparable`接口或者使用`Comparator`进行排序,例如`Arrays.sort(points, Comparator.comparingDouble(p -&gt; p.x))`。 3. **分治递归**: - **基线情况**:如果点的数量小于等于4,我们可以...

    java数据结构与算法

    - **接口**:如Comparable和Comparator,用于比较对象,支持自定义排序规则。 - **并发编程**:Java提供了synchronized、Lock等机制,支持多线程环境下的数据结构操作。 4. **高级主题**: - **并发数据结构**:...

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

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

    Algorithms_and_Data_Structures:算法和数据结构的标准实现

    如果你需要自定义树结构,可以实现Comparable接口或者提供Comparator。 5. **哈希表**:HashMap是Java中最常用的哈希表实现,提供了O(1)的平均时间复杂度。如果需要保证元素的唯一性,可以使用HashSet。 6. **图...

    Comp2230_Algorithms:包含纽卡斯尔大学 COMP2230 所需的所有算法

    Java中,可以利用Collections.sort()方法对List进行排序,但对于自定义类型,需要实现Comparable接口或提供Comparator。例如,快速排序的Java实现通常涉及到递归和枢轴元素的选择策略。 二、搜索算法 搜索算法主要...

    ITS202:算法和数据结构

    - **接口与抽象类**:Comparable和Comparator接口,以及如何自定义比较逻辑。 - **泛型**:理解和使用泛型来提高代码的复用性和安全性。 - **异常处理**:掌握try-catch-finally语句块,理解Checked和Unchecked...

    Competitive-Programming-DSA

    - **接口与多态**:实现面向对象设计,如Comparable和Comparator接口。 - **异常处理**:捕获和处理程序运行时可能出现的问题。 - **IO流**:处理输入输出,如BufferedReader、Scanner用于读取用户输入,...

    algorithm:算法

    对于自定义类,需要实现Comparable接口或提供Comparator。例如,快速排序是一种高效的算法,通过分治策略实现,其Java实现涉及递归和数组操作。 2. **搜索算法**:二分查找适用于已排序的数组,它通过每次比较中间...

    leetcode

    Java中的Arrays.sort()函数可以处理基本类型和对象数组的排序,但对于自定义数据结构,我们可能需要实现Comparable接口或者提供Comparator。在LeetCode中,你会遇到快速排序、归并排序、堆排序等高级排序算法的实现...

    JAVA源码最短路径算法实现k-shortest-paths

    随着应用场景的扩展,研究者们提出了多种算法来解决这个问题,其中不仅包括单一最短路径的计算,也包括了求解多条最短路径的需求。本篇将详细介绍如何利用Java语言实现一种名为k-shortest-paths(KSP)的算法,该...

    dsa-java:JAVA 中的所有 DSA 作业

    - **Comparable和Comparator**:实现这两个接口可以定制元素的比较逻辑,用于排序。 - **并发编程**:Java的synchronized关键字、 volatile变量、线程池、Lock接口等,用于多线程环境下的数据同步和控制。 4. **...

    leetcodeAnswer:leetcode解法

    7. 二分查找:Java的Comparable和Comparator接口可用于实现自定义比较逻辑,方便进行二分查找。 8. 泛型与模板方法:利用泛型提高代码复用性,设计模式中的模板方法可抽象出公共操作流程。 9. 并发编程:对于多...

Global site tag (gtag.js) - Google Analytics