自定义排序 WritableComparable

简介: 自定义排序 WritableComparable

自定义 bean 对象将其作为 Map 输出的 key 来传输,需要实现 WritableComparable 接口重写 `compareTo()`方法,就可以实现排序。

compareTo()` 方法解析:

intcompareTo(To)

 **参数**:o表示要比较的对象。


 **作用**:比较此对象与指定对象的顺序。


 **返回值**:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。


 实现 WritableComparable 接口重写 `compareTo()`方法的具体实现:

publicclassFlowBeanSortimplementsWritableComparable<FlowBeanSort> {
privatelongupFlow;     // 上行总流量privatelongdownFlow;  // 下行总流量privatelongsumFlow;  // 总流量    ...
// 自定义排序规则,按照总流量倒序排序@OverridepublicintcompareTo(FlowBeanSorto) {
// 自定义降序排列returnthis.sumFlow>o.getSumFlow() ?-1 : 1;
    }
}

 也就是说当语句`return this.sumFlow > o.getSumFlow() ? 1 : -1;`的返回值为1时,即当this的值大于o的值时,`compareTo`是按照升序(由小到大)排序的。


 当返回值为-1时,也就是说this的值小于o的值时,`compareTo`是按照降序(由大到小)排序的。


 完整的 bean 程序如下所示:

ackagecom.xiaowang.mr.sort;
importjava.io.DataInput;
importjava.io.DataOutput;
importjava.io.IOException;
importorg.apache.hadoop.io.WritableComparable;
/*** 自定义一个 bean 类,实现 WritableComparable 接口重写 compareTo()方法,实现自定义排序* * @author Administrator**/publicclassFlowBeanSortimplementsWritableComparable<FlowBeanSort> {
privatelongupFlow; // 总上行流量privatelongdownFlow; // 总下行流量privatelongsumFlow; // 总流量// 无参构造方法必须有,目的是为了在反序列化操作创建对象实例时调用无参构造器publicFlowBeanSort() {
super();
    }
// 序列化方法,目的是为了对象的初始化publicFlowBeanSort(longupFlow, longdownFlow, longsumFlow) {
super();
this.upFlow=upFlow;
this.downFlow=downFlow;
this.sumFlow=sumFlow;
    }
publiclonggetUpFlow() {
returnupFlow;
    }
publicvoidsetUpFlow(longupFlow) {
this.upFlow=upFlow;
    }
publiclonggetDownFlow() {
returndownFlow;
    }
publicvoidsetDownFlow(longdownFlow) {
this.downFlow=downFlow;
    }
publiclonggetSumFlow() {
returnsumFlow;
    }
publicvoidsetSumFlow(longsumFlow) {
this.sumFlow=sumFlow;
    }
// 序列化方法,将对象的字段信息写入输出流@Overridepublicvoidwrite(DataOutputout) throwsIOException {
out.writeLong(upFlow);
out.writeLong(downFlow);
out.writeLong(sumFlow);
    }
// 反序列化方法,从输入流中读取各个字段信息// 注意:字段的反序列化顺序需要和序列化的顺序保持一致,而且字段的类型和个数也要保持一致@OverridepublicvoidreadFields(DataInputin) throwsIOException {
this.upFlow=in.readLong();
this.downFlow=in.readLong();
this.sumFlow=in.readLong();
    }
// 实现自定义排序,按照总流量倒序排序@OverridepublicintcompareTo(FlowBeanSorto) {
// 自定义降序排列returnthis.sumFlow>o.getSumFlow() ?-1 : 1;
    }
// 重写toString()方法@OverridepublicStringtoString() {
returnupFlow+"\t"+downFlow+"\t"+sumFlow;
    }
}
相关文章
|
1月前
|
Java
Comparable和Comparator两种比较器详解
Comparable和Comparator两种比较器详解
25 0
|
10月前
Comparable与Comparator对象比较
Comparable与Comparator对象比较
33 0
排序Comparable 和 Comparator的区别
排序Comparable 和 Comparator的区别
101 0
Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?
Comparable和Comparator有什么区别?你知道他们和Arrays.sort的关系吗?
79 0
利用Comparable接口实现对对象数组的排序
利用Comparable接口实现对对象数组的排序
利用Comparable接口实现对对象数组的排序
|
Java
Java对象的比较和排序(Comparator和Comparable)
Java对象的比较和排序(Comparator和Comparable)
136 0
Java对象的比较和排序(Comparator和Comparable)
Comparable与Comparator有什么区别?
Comparable与Comparator有什么区别?
184 0
|
Java
说说Comparator比较器那些用法
关于java的排序,在java8之后有了函数式接口之后,就产生了很多种Comparator比较器的写法。细数一下那些常用的比较器。
1282 1
说说Comparator比较器那些用法
|
存储 Java 索引
【Java集合类】之TreeSet集合与Comparable/Comparator排序
【Java集合类】之TreeSet集合与Comparable/Comparator排序
125 0
|
Java 开发者
Comparable 比较器|学习笔记
快速学习 Comparable 比较器
119 0
Comparable 比较器|学习笔记