先假设我们要定义的WritableComparable类实现类Block中参与比较的字段如下:
String name;int age;
且比较顺序为:age,name
这里假设在write方法中写入输出流的顺序为age,name
public static class Comparator extends WritableComparator {
private static final IntWritable.Comparator INT_COMPARATOR = new IntWritable.Comparator();
private static final Text.Comparator TEXT_COMPARATOR = new Text.Comparator();
public Comparator() {
super(Block.class);
}
@Override
public int compare(byte[] b1, int s1, int l1,
byte[] b2, int s2, int l2) {
try {
int thisagelen = WritableUtils.decodeVIntSize(b1[s1])+readVInt(b1,s1);
int thatagelen = WritableUtils.decodeVIntSize(b1[s1])+readVInt(b1,s1);
//byte数组中数据的存储结构为
//age.len,age.value,name.len,name.value
//因此需要先计算age的长度,然后使用基本类型的比较规则
int cmp = INT_COMPARATOR.compare(b1, s1, thisagelen, b2, s2, thatagelen);
//如果比较结果返回0即age相等则继续比较name
if(0!=cmp) return cmp;
else return TEXT_COMPARATOR.compare(b1, s1+thisagelen, l1-thisagelen, b2, s2+thatagelen, l2-thatagelen);
} catch (Exception e) {
throw new IllegalArgumentException();
}
}
}
static {
// register this comparator
WritableComparator.define(Block.class, new Comparator());
}