先给出一般过程分析,在代码片段中注释非常清晰!!!
过程解析:
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);
}
}
}