JAVA_自定义排序(Comparable、Comparator)详解

先给出一般过程分析,在代码片段中注释非常清晰!!!

过程解析:
1.Comparable
Comparable是放在自定义数据类型内部,所定义数据类型需要继承此接口,并重写其内部CompareTo方法,实现自定义排序;
2.Comparator
Comparator自定义排序是写在主函数内部的一个对象,可以实例化,但在实例化时需要实现其内部的Compare方法;
3.注意事项
1.实例化时需要指明其节点类型
2.调用方法

//调用自定义排序方法
		Collections.sort(list_one); //排序方法写在内部,直接调用Comparable
		Collections.sort(list_two,MyComparator);   //前边是所排列集合,后边是自定义比较容器
		//外部自定义比较容器Comparator

样例输入:

4
5 2
3 4
6 4
5 3
5 3 6 5
2 4 4 3

样例输出:

Comparable自定义比较输出:
3 4
5 3
5 2
6 4

Comparator自定义比较输出:
3 4
5 3
5 2
6 4

代码:

package 练习三;
import java.util.*;

//1.Comparable自定义排序
//将比较方法隐含在自定义存储类型内部,以类为基点
class Node implements Comparable<Node>{	//	必须指明比较器中存储类型
	int key;
	int values;
	public Node(int key,int values) {
		this.key=key;
		this.values=values;
	}
	
	//重写自定义排序方法
	@Override
	public int compareTo(Node o) {
		// TODO 自动生成的方法存根
		if(this.key!=o.key) {
			return this.key-o.key;	//	升序:自己的减去人家的(键升序)
		}
		else {
			return o.values-this.values;	//降序:别人家减去自家的(值降序)
		}
	}
}

//2.用于自定义排序的自定义类型
class cNode{
	int key;
	int values;
	
	//自定义构造函数,便于输入输出
	public cNode(int key) {
		this.key=key;
	}
}

//主函数
public class Test {
	
	//2.Comparator自定义排序————函数
	//是单独罗列出来的比较方法,是以方法为基点进行比较
	public static Comparator<cNode> MyComparator=new Comparator<cNode>() {	//	表明存储类型

		@Override
		public int compare(cNode e1, cNode e2) {
			// TODO 自动生成的方法存根
			if(e1.key!=e2.key) {
				return e1.key-e2.key;	//升序:前边元素减去后边元素(键升序)
			}
			else {
				return e2.values-e1.values;	//	降序:后边元素减去前边元素(值降序)
			}
		}
		
	};

	//主方法
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc=new Scanner(System.in);
		
		List<Node> list_one=new ArrayList<Node>();	//	第一种比较
		List<cNode> list_two=new ArrayList<cNode>();	//	第二种比较
		
		//两组均输入四组数据:(5,2)、(3,4)、(6,4)、(5,3)
		int n=sc.nextInt();	//	输入n等于4
		
		//第一组输入
		for(int i=0;i<n;i++) {
			list_one.add(new Node(sc.nextInt(),sc.nextInt()));
		}
		
		//第二组输入,先输入每个节点的键,再输入每个节点的值
		for(int i=0;i<n;i++) {
			list_two.add(new cNode(sc.nextInt()));
		}
			//	输入值
		for(int i=0;i<n;i++) {
			list_two.get(i).values=sc.nextInt();
		}
		
		//调用自定义排序方法
		Collections.sort(list_one);
		Collections.sort(list_two,MyComparator);   //前边是所排列集合,后边是自定义比较容器
		
		//输出
		System.out.println("Comparable自定义比较输出:");
		
		for(Node nd:list_one) {
			System.out.println(nd.key+" "+nd.values);
		}
		
		System.out.println();  //换行输出

		System.out.println("Comparator自定义比较输出:");
		
		for(cNode cnd:list_two) {
			System.out.println(cnd.key+" "+cnd.values);
		}
		
	}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值