Java常用类_Java比较器

旧巷老猫 提交于 2019-11-29 13:42:16

关于这部分知识可以在集合那块说,但在这说一下也无伤大雅,就是两个接口的不同实现。

Comparable与Comparator

1.说明:

   == !=  >  <  >=  <=

  ① >  <  >=  <= 适用于基本数据类型中的非boolean的7种

  ② ==  != 适用于基本数据类型和引用数据类型。

2.默认情况下,引用数据类型的变量是不可以比较大小的。但是在实际开发中,我们又有这样的需求。应该如何实现呢?

    实现方法一:自然排序:Comparable

    实现方法二:定制排序:Comparator

3. 自然排序:Comparable

  ① 要求待排序的对象所属的类必须实现Comparable

  ② 要重写接口中的compareTo(Object obj),指明如何排序(使用对象的属性进行比较,实现排序)

4. 定制排序:Comparator

  ① 创建实现了Comparator接口的实现类的对象

  ② 重写接口中的compare(Object o1,Object o2),指明如何排序(使用对象的属性进行比较,实现排序)

 建一个Goods类实现Comparable接口并重写自然排序方法CompareTo()

public class Goods implements Comparable{
	private String name;
	
	private double price;
	
	public Goods() {
		super();
	}
	public Goods(String name, double price) {
		super();
		this.name = name;
		this.price = price;
	}
	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 "Goods [name=" + name + ", price=" + price + "]";
	}
	/**
	 * 如何比较两个对象的大小,需要调用如下的方法
	 * 
	 * @return  
	 * 如果返回值为正数,表示调用此方法的对象大;
	 * 如果返回值为负数,表示调用此方法的对象小;
	 * 如果返回值为零,表示两个对象一样大
	 * 
	 * 按照价格从低到高排列,如果价格相同,再按照产品名称排列
	 */
	@Override
	public int compareTo(Object o) {
		if(this == o){
			return 0;
		}
		
		if(o instanceof Goods){
			Goods g1 = (Goods)o;
			
			//先比较价格,再比较名称
			if(Double.compare(this.price, g1.price) != 0){
				return -Double.compare(this.price, g1.price);
			}else{
				return this.name.compareTo(g1.name);
			}
			
		}else{
			throw new RuntimeException("输入的类型不匹配");
		}
	}
	
	
}

测试自然排序:

@Test
public void test2(){
	Goods g1 = new Goods("samsumgnote10", 7999);
	Goods g2 = new Goods("huaweimate30", 5999);
	Goods g3 = new Goods("lenovo", 1999);
	Goods g4 = new Goods("xiaomi9", 2999);
	Goods g5 = new Goods("vivox27pro", 4999);
	Goods g6 = new Goods("oppofindx", 2999);
	
	Goods[] arr = new Goods[]{g1,g2,g3,g4,g5,g6};
	for(int i = 0;i < arr.length;i++){
		System.out.println(arr[i]);
	}
	
	Arrays.sort(arr);
	
	System.out.println("排序以后:");
	
	for(int i = 0;i < arr.length;i++){
		System.out.println(arr[i]);
	}
}

定制排序(Comparator):

@Test
public void test3(){
	String[] arr = new String[]{"CC","DD","MM","AA","GG","JJ","ZZ"};
	System.out.println(Arrays.toString(arr));
	
	Arrays.sort(arr,new Comparator(){
		
		//通过此方法的重写,指明对象的排序方式
		@Override
		public int compare(Object o1, Object o2) {
			if(o1 instanceof String && o2 instanceof String){
				String s1 = (String)o1;
				String s2 = (String)o2;
				return -s1.compareTo(s2);
			}else{
				throw new RuntimeException("输入的类型不匹配");
			}
		}
		
	});	
	System.out.println(Arrays.toString(arr));
}

注意@Test使用的是eclipse中的JUnit Test Case。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!