自定义 bean 对象将其作为 Map 输出的 key 来传输,需要实现 WritableComparable 接口重写 `compareTo()`方法,就可以实现排序。
compareTo()` 方法解析:
intcompareTo(To)
**参数**:o表示要比较的对象。
**作用**:比较此对象与指定对象的顺序。
**返回值**:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
实现 WritableComparable 接口重写 `compareTo()`方法的具体实现:
publicclassFlowBeanSortimplementsWritableComparable<FlowBeanSort> { privatelongupFlow; // 上行总流量privatelongdownFlow; // 下行总流量privatelongsumFlow; // 总流量 ... // 自定义排序规则,按照总流量倒序排序publicintcompareTo(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; } // 序列化方法,将对象的字段信息写入输出流publicvoidwrite(DataOutputout) throwsIOException { out.writeLong(upFlow); out.writeLong(downFlow); out.writeLong(sumFlow); } // 反序列化方法,从输入流中读取各个字段信息// 注意:字段的反序列化顺序需要和序列化的顺序保持一致,而且字段的类型和个数也要保持一致publicvoidreadFields(DataInputin) throwsIOException { this.upFlow=in.readLong(); this.downFlow=in.readLong(); this.sumFlow=in.readLong(); } // 实现自定义排序,按照总流量倒序排序publicintcompareTo(FlowBeanSorto) { // 自定义降序排列returnthis.sumFlow>o.getSumFlow() ?-1 : 1; } // 重写toString()方法publicStringtoString() { returnupFlow+"\t"+downFlow+"\t"+sumFlow; } }