package mil.nga.giat.geowave.analytic.mapreduce;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
/**
* Used for (1) representation of collections (2) summation in a combiner (3)
* and finally, for computation of averages
*/
public class CountofDoubleWritable implements
Writable,
WritableComparable
{
private double value = 0.0;
private double count = 0.0;
public CountofDoubleWritable() {
}
public CountofDoubleWritable(
final double value,
final double count ) {
set(
value,
count);
}
@Override
public void readFields(
final DataInput in )
throws IOException {
value = in.readDouble();
count = in.readDouble();
}
@Override
public void write(
final DataOutput out )
throws IOException {
out.writeDouble(value);
out.writeDouble(count);
}
public void set(
final double value,
final double count ) {
this.value = value;
this.count = count;
}
public double getValue() {
return value;
}
public double getCount() {
return count;
}
/**
* Returns true iff <code>o</code> is a DoubleWritable with the same value.
*/
@Override
public boolean equals(
final Object o ) {
if (!(o instanceof CountofDoubleWritable)) {
return false;
}
return compareTo(o) == 0;
}
@Override
public int hashCode() {
return (int) Double.doubleToLongBits(value / count);
}
@Override
public int compareTo(
final Object o ) {
final CountofDoubleWritable other = (CountofDoubleWritable) o;
final double diff = (value / count) - (other.value / other.count);
return (Math.abs(diff) < 0.0000001) ? 0 : (diff < 0 ? -1 : 0);
}
@Override
public String toString() {
return Double.toString(value) + "/" + Double.toString(count);
}
/** A Comparator optimized for DoubleWritable. */
public static class Comparator extends
WritableComparator implements
Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
public Comparator() {
super(
CountofDoubleWritable.class);
}
@Override
public int compare(
final byte[] b1,
final int s1,
final int l1,
final byte[] b2,
final int s2,
final int l2 ) {
final double thisValue = readDouble(
b1,
s1);
final double thatValue = readDouble(
b2,
s2);
return Double.compare(
thisValue,
thatValue);
}
}
static { // register this comparator
WritableComparator.define(
CountofDoubleWritable.class,
new Comparator());
}
}