java Comparator和Comparable使用
来源:互联网 发布:守望先锋左上角6个数据 编辑:程序博客网 时间:2024/05/22 06:56
参考:
1、http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html
2、https://stackoverflow.com/questions/6176019/comparing-long-values-using-collections-sortobject
3、http://www.java2blog.com/2013/02/difference-between-comparator-and-comparable-in-java.html
4、http://www.geeksforgeeks.org/comparable-vs-comparator-in-java/
一、背景
1、常见的面试问题之一是“比较器和比较器之间有什么区别”。或者“如何通过其id或名称对员工对象的收集进行排序”。
为此,我们可以使用两个接口。比较器和可比较。在我们实际看到差异之前,让我简单介绍一下。
2、如果任何类实现可比较的内容,那么该对象的集合可以使用Collection.sort()或Arrays.sort()自动排序。
对象将根据该类中的compareTo方法进行排序。
在Java中实现Comparable的对象可以像TreeMap或SortedSet一样用作TreeSet中的键,而不需要实现任何其他接口。
二、区别
Paramter
Comparable
Comparator
排序逻辑
排序逻辑必须在对象正在排序的同一个类中。
因此,这被称为对象的自然排序
排序逻辑是分开的类。
因此,我们可以根据要排序的对象的不同属性编写不同的排序。
例如使用id,名称等进行排序
实现
要排序的对象的类必须实现此接口。
Product类需要通过uuid实现与
Product对象的集合相当的类
要对其进行排序的对象不需要实现此接口的类。
其他类可以实现此接口。
Eg-UserComparator
类可以实现Comparator接口,
按照id来对User/id对象进行排序
排序方法
int compareTo(Object o1)
此方法将此对象与o1对象进行比较,并返回一个整数。
它的值具有以下含义
1.正 - 此对象大于o2
2.零 - 此对象等于o1
3.负 - 此对象为小于o1
int compare(Object o1,Object o2)
此方法比较o1和o2对象。并返回一个整数。
它的值具有以下含义。
1.正 - o1大于o2
2.零 - o1等于o2
3.负 - o1小于o1
调用方法
Collections.sort(List)这里的对象
将按照CompareTo方法进行排序
Collections.sort(List,Comparator)
这里的对象将根据比较方法在Comparator中进行排序
包
java.lang.Comparable
java.util.Comparator
三、使用
1、使用实现Comparable接口对Product的UUID进行降序排序
创建java类Product.java:
package com.ngaa.java.test.common;/** * Created by root on 20170819. * Update date: * Time: 16:36 * Project: sparkmvn * Package: com.ngaa.java.test.common * Describe :implement sort by uuid desc. ** Result of Test: test ok * Command: *
*
* Email: jifei.yang@ngaa.com.cn * Status:using online * Machine ip: * ^^cluster---->192.168.1.1 (001 calculation) * ^^cluster----->127.0.0.1 (002 calculation) *
* Attention: */public class Product implements Comparable
{ private Long uuid; private String name; private Double price; public Product(){} public Product(Long uuid, String name, Double price) { this.uuid = uuid; this.name = name; this.price = price; } public Long getUuid() { return uuid; } public void setUuid(Long uuid) { this.uuid = uuid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } @Override public String toString() { return "Product{" + "uuid=" + uuid + ", name='" + name + '\'' + ", price=" + price + '}'; } @Override public int compareTo(Product o) { /** *默认是升序排序,需要重新该方法 */ //源码信息中有说明:-1代表a小于b,0代表a等于b,1代表a大于b return (this.uuid>o.uuid)?-1:(this.uuid==o.uuid?0:1); }}
2、使用实现Comparator接口对User的id进行降序排序
(1)创建User.java
package com.ngaa.java.test.common;import java.io.Serializable;/** * Created by root on 20170819. * Update date: * Time: 16:34 * Project: sparkmvn * Package: com.ngaa.java.test.common * Describe :user info . ** Result of Test: test ok * Command: *
*
* Email: jifei.yang@ngaa.com.cn * Status:using online * Machine ip: * ^^cluster---->192.168.1.1 (001 calculation) * ^^cluster----->127.0.0.1 (002 calculation) *
* Attention: */public class User implements Serializable { private Long id; private String name; private Integer age; public User(){} public User(Long id, String name, Integer age) { this.id = id; this.name = name; this.age = age; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; }}
(2)创建自定义比比较器UserComparator.java
package com.ngaa.java.test.common;import java.util.Comparator;/** * Created by root on 20170819. * Update date: * Time: 16:39 * Project: sparkmvn * Package: com.ngaa.java.test.common * Describe :sort by id desc. ** Result of Test: test ok * Command: *
* Email: jifei.yang@ngaa.com.cn * Status:using online * Machine ip: * ^^cluster---->192.168.1.1 (001 calculation) * ^^cluster----->127.0.0.1 (002 calculation) *
* Attention: */public class UserComparator implements Comparator
{ @Override public int compare(User o1, User o2) { Long s_id=o1.getId(); Long e_id=o2.getId(); return (s_id>e_id?-1:(s_id==e_id?0:1)); //默认是升序排序,所以需要重写 }}
3、创建测试类TestCollectionSort.java
package com.ngaa.java.test.sort;import com.ngaa.java.test.common.Product;import com.ngaa.java.test.common.User;import com.ngaa.java.test.common.UserComparator;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * Created by root on 20170819. * Update date: * Time: 16:46 * Project: sparkmvn * Package: com.ngaa.java.test.sort * Describe :test collection sort . ** Result of Test: test ok * Command: *
*
* Email: jifei.yang@ngaa.com.cn * Status:using online * Machine ip: * ^^cluster---->192.168.1.1 (001 calculation) * ^^cluster----->127.0.0.1 (002 calculation) *
* Attention: */public class TestCollectionSort { public static void main(String[] args) { TestCollectionSort testCollectionSort=new TestCollectionSort(); System.out.println("-------------------------Comparable接口排序结果------------------------------"); testCollectionSort.sortByUuid(); System.out.println("-------------------------Comparator接口排序结果------------------------------"); testCollectionSort.sortById(); } /** * 一、使用实现Comparable接口来倒序排序 */ public void sortByUuid(){ //1、创建List集合(产品) List
productList=new ArrayList (){ { add(new Product(1008l,"Car",66.0)); add(new Product(1001l,"Shooese",6.0)); add(new Product(1002l,"Phone",666.0)); add(new Product(1009l,"Computer",66.0)); add(new Product(1003l,"Apple",6.0)); add(new Product(1003l,"Bike",66.0)); } }; // System.out.println(Long.compare(1l,2l)); //2、倒序排序 Collections.sort(productList); //3、遍历结果 for(Product product:productList){ System.out.println(product); } } /** * 二、自定义比较器实现倒序排序 */ public void sortById(){ //1、创建List集合(用户) List userList=new ArrayList (){ { add(new User(2003l,"Tom",18)); add(new User(2004l,"Cassie",21)); add(new User(2002l,"Jim",16)); add(new User(2002l,"Sam",16)); add(new User(2008l,"Jams",19)); add(new User(2007l,"Jack",26)); add(new User(2009l,"Tom",18)); } }; //2、使用比较器 Collections.sort(userList, new UserComparator()); //3、遍历结果 for(User user:userList){ System.out.println(user); } }}
4、排序结果
- java Comparator和Comparable使用
- java 接口Comparable和Comparator的使用
- java Comparable和Comparator
- JAVA Comparator 和 Comparable
- java comparator和comparable
- Java Comparable 和 Comparator
- java的Comparator和Comparable
- java comparable 和 comparator 排序
- Java中的Comparable和Comparator
- java的Comparator和Comparable
- JAVA Comparable 和Comparator用法
- java的Comparator和Comparable
- JAVA Comparable 和Comparator用法
- java comparable和Comparator 区别
- JAVA Comparable 和Comparator用法
- JAVA Comparable 和Comparator区别
- Java之Comparable和Comparator
- java的Comparator和Comparable
- 多线程中start()与run()方法的区别
- python文件运行问题
- ZigZag Conversion an interesting approach
- android 动态改变图标颜色
- centos 中安装ffmpeg 及 libx264 库 MP3库
- java Comparator和Comparable使用
- 朴素贝叶斯-新闻分类
- Unexpected exception parsing XML document from class path resource
- Groovy语法之类
- POI各Jar包的作用
- 字符串
- android AIDL
- Android设计模式之MVVM
- 工厂模式