Java学习笔记-----comparable和comparator使用方法

我的梦境 提交于 2019-12-08 04:30:39

我不知道是为啥,最近特别想写博客,在这里不仅仅能复习,还可能在写的同时,想到新的东西,感觉很棒,所谓温故而知新吧!

那么开始今天的话题:在之前有一篇博客写到对一个对象排序的程序段,在那个里面提到了comparator接口,但是在那个里面有的人可能不理解,现在详细讲一下。

什么时候我们需要使用这两个接口呢?
当然是在排序的时候了,一般时候我们都是拿collection.sort()方法来进行排序,那么……

static <T extends Comparable<? super T>> 
void sort(List<T> list) 
//根据元素的自然顺序 对指定列表按升序进行排序。

 
static <T> void 
sort(List<T> list, Comparator<? super T> c) 
//根据指定比较器产生的顺序对指定列表进行排序。 

我查了一下Java API, 如上面一段代码
(1)第一个方法是传入List链,但是这个list必须是comparable类型的
(2)第二个方法是传入一个list链(泛型不泛型无所谓),再传入一个参数是comparator对象

那么且听我细细道来
首先我们设计一个类,叫什么呢?我喜欢一个动漫很久了,那么就拿这个举例吧
首先还是创建一个类,但是这个和之前的是有区别的,这个是能进行比较的对象。


public class OnePiece implements Comparable {
	private String name;//名字
	private int value;//赏金
	private String FightName;//攻击技能
	public OnePiece(String name,int value,String f) {
		this.name = name;
		this.value = value;
		this.FightName = f;
	}
	@Override
	public String toString() {
		return String.format("%s    %d    %s", name, value, FightName);
	}
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub
		OnePiece one = (OnePiece) o;
		return this.value - one.value;
	}
}

我设计了一个onepiece类,没错,你没有看错,就是海贼*,里面的三个成员都写上注释了。

这个类实现comparable接口,之后才能被collection.sort()方法进行排序,与此同时我们还要重写compareTo()方法,比较的内容是根据赏金进行升序排序。所以返回的就是本对象的赏金减去所比较对象的赏金。

那么我们写个main函数测试一下能不能进行排序

import java.util.*;

public class ComparableDemo {
	public static void main(String [] args) {
		List list = new ArrayList();
		OnePiece [] o = {
			new OnePiece("路飞",150000,"火拳铳"),
			new OnePiece("索隆",78000,"三千世界"),
			new OnePiece("山治",56000,"恶魔风脚")
		};
		for(int i = 0;i < o.length;i++) {
			list.add(o[i]);
		}
		Collections.sort(list);
		System.out.println(list);
	}
}

看看输出结果:

[山治   56000  恶魔风脚, 索隆   78000  三千世界, 路飞   150000   火拳铳]

输出的的确是升序输出的。

但是我们想一下,如果说想要对其他的数据进行排序呢?假如说我的类里面还要加上一个数据叫:等级。之后想达到的目的是按照等级进行排序,如果那样达的话,我们要改这个类吗?会不会太麻烦了?

那么,不还有一个sort方法呢吗?

我们在这个方法上做点文章。
设计一个类,叫做comparevalue类,实现comparator接口重写compare方法

import java.util.Comparator;

public class CompareValue implements Comparator{
	@Override
	public int compare(Object arg0, Object arg1) {
		// TODO Auto-generated method stub
		OnePiece o1 = (OnePiece) arg0;
		OnePiece o2 = (OnePiece) arg1;
		return o1.getValue() - o2.getValue();
	}
}

重写的compare方法和那个compareto方法也类似,只不过需要从类里面提取一下赏金数据而已,自己理解一下。

排序的结果都是一样的。

好了,我感觉写的也差不多了,写了一个半小时,感觉好累呀,但是非常充实啊,每天进步一点点,我肯定能变厉害的,加油!
(对了,我之前还写了个关于Collection sort方法的博客,大家有兴趣的话,就看看吧)
多多点赞,会变好看,多多留言,会变有钱,好了,大家,一起加油哦,灰灰了。

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