在开发过程中,我们经常会涉及到对象比较的问题,今天就来总结一下对象比较的几种方式,一起随小编往下看吧!
对于JDK1.8而言,有3种实现对象比较的方法:
1、覆写Object类的equals()方法;
2、继承Comparable接口,并实现compareTo()方法;
3、定义一个单独的对象比较器,继承自Comparator接口,实现compare()方法。
试比较Comparable 和Comparator 的区别?
- 如果对象数组需要排序,那么就必须设置排序规则,就要使用这两种比较器
- 对于Comparable接口来说,它往往是进行比较类需要实现的接口,它仅包含一个有compareTo()方法,只有一个参数,返回值为int,返回值大于0表示对象大于参数对象;小于0表示对象小于参数对象;等于0表示两者相等
- 对于Comparator接口来说,它的实现者被称为比较器,它包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,不同之处是Comparator接口一般不会被集合元素类所实现,而是单独实现或者匿名内部类方式实现
package com.test.model;
import io.swagger.annotations.ApiModelProperty;
/**
* @Author tanghh
* @Date 2020/3/8 9:24
* 商品类
*/
public class Product implements Comparable {
@ApiModelProperty(value = "id")
private int id;
@ApiModelProperty(value = "商品数量")
private int count;
@ApiModelProperty(value = "商品名称")
private String productName;
public Product(int id, int count, String productName) {
this.id = id;
this.count = count;
this.productName = productName;
}
@Override
public String toString() {
return "Product{" +
"id=" + id +
", count=" + count +
", productName='" + productName + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
@Override
public int compareTo(Product o) {
//升序
int i = this.getCount() - o.getCount();
//降序
//int i = o.getCount() - this.getCount();
return i;
}
}
降序的代码:
package com.test.model;
import io.swagger.annotations.ApiModelProperty;
/**
* @Author tanghh
* @Date 2020/3/8 9:24
* 商品类
*/
public class Product implements Comparable {
@ApiModelProperty(value = "id")
private int id;
@ApiModelProperty(value = "商品数量")
private int count;
@ApiModelProperty(value = "商品名称")
private String productName;
public Product(int id, int count, String productName) {
this.id = id;
this.count = count;
this.productName = productName;
}
@Override
public String toString() {
return "Product{" +
"id=" + id +
", count=" + count +
", productName='" + productName + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
@Override
public int compareTo(Product o) {
//升序
//int i = this.getCount() - o.getCount();
//降序
int i = o.getCount() - this.getCount();
return i;
}
}
测试类:
package com.test.nodefault;
import com.test.model.Product;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @Author tanghh
* @Date 2020/3/8 9:30
* 测试类
*/
public class ProductTest {
public static void main(String[]args){
//第一种方式: 定义一个List集合,向集合中商品对象,使用比较器将内容排序输出
List list1 = new ArrayList<>();
list1.add(new Product(1,1000,"旺仔牛奶"));
list1.add(new Product(2,222,"保温杯"));
list1.add(new Product(3,333,"按摩机"));
list1.add(new Product(4,444,"养生壶"));
list1.add(new Product(5,6666,"码出高效Java开发手册"));
Collections.sort(list1);
for (Product product : list1) {
System.out.println("值为:----"+product);
}
}
}
升序的结果:
降序的结果:
适用场景: 如果我们需要对一个类进行排序,但是这个类没有实现Comparable 接口,那么我们就可以写一个“比较器”。
compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
package com.test.nodefault;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* @Author tanghh
* @Date 2020/3/8 9:42
* Comparator的用法
*/
public class ComparatorTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("aaaaa");
list.add("bbbbb");
list.add("ccccc");
Collections.sort(list, new Comparator() {
public int compare(String str1, String str2) {
//1: 按首字母升序【升序排的话就是第一个参数.compareTo(第二个参数)】
// return str1.compareTo(str2);
//2:按照首字母降序 降序排的话就是第二个参数.compareTo(第一个参数);
// return str2.compareTo(str1);
//3:按照第二字母升序
// char c1 = str1.charAt(1);
// char c2 = str2.charAt(1);
// return c1 - c2;
//4.按照第二字母升序
char c1 = str1.charAt(1);
char c2 = str2.charAt(1);
return c2 - c1;
}
});
System.out.println(list);
}
}
1.Comparable 类是java.lang包下,里面就一个方法。
public int compareTo(T o);
2.Comparator 类是 java.util包下,里面有很多方法。下面列出一俩个,还有一些没列举出来。
int compare(T o1, T o2);
boolean equals(Object obj);
3. 一个类如果想要保持原样,又需要进行不同方式的比较(排序),就可以定制比较器(实现 Comparator 接口)。
一个类实现Comparable ,就可以自然排序。
https://www.cnblogs.com/ldy-blogs/p/8488138.html
https://blog.csdn.net/wo8vqj68/article/details/81164163
https://www.cnblogs.com/learnapi/p/9003112.html
https://blog.csdn.net/qing_gee/article/details/103884684