RandomDatum.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:3k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.io;
  19. import java.util.*;
  20. import java.io.*;
  21. public class RandomDatum implements WritableComparable {
  22.   private int length;
  23.   private byte[] data;
  24.   public RandomDatum() {}
  25.   public RandomDatum(Random random) {
  26.     length = 10 + (int) Math.pow(10.0, random.nextFloat() * 3.0);
  27.     data = new byte[length];
  28.     random.nextBytes(data);
  29.   }
  30.   public int getLength() {
  31.     return length;
  32.   }
  33.   
  34.   public void write(DataOutput out) throws IOException {
  35.     out.writeInt(length);
  36.     out.write(data);
  37.   }
  38.   public void readFields(DataInput in) throws IOException {
  39.     length = in.readInt();
  40.     if (data == null || length > data.length)
  41.       data = new byte[length];
  42.     in.readFully(data, 0, length);
  43.   }
  44.   public int compareTo(Object o) {
  45.     RandomDatum that = (RandomDatum)o;
  46.     return WritableComparator.compareBytes(this.data, 0, this.length,
  47.                                            that.data, 0, that.length);
  48.   }
  49.   public boolean equals(Object o) {
  50.     return compareTo(o) == 0;
  51.   }
  52.   private static final char[] HEX_DIGITS =
  53.   {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
  54.   /** Returns a string representation of this object. */
  55.   public String toString() {
  56.     StringBuffer buf = new StringBuffer(length*2);
  57.     for (int i = 0; i < length; i++) {
  58.       int b = data[i];
  59.       buf.append(HEX_DIGITS[(b >> 4) & 0xf]);
  60.       buf.append(HEX_DIGITS[b & 0xf]);
  61.     }
  62.     return buf.toString();
  63.   }
  64.   public static class Generator {
  65.     Random random;
  66.     private RandomDatum key;
  67.     private RandomDatum value;
  68.     
  69.     public Generator() { random = new Random(); }
  70.     public Generator(int seed) { random = new Random(seed); }
  71.     public RandomDatum getKey() { return key; }
  72.     public RandomDatum getValue() { return value; }
  73.     public void next() {
  74.       key = new RandomDatum(random);
  75.       value = new RandomDatum(random);
  76.     }
  77.   }
  78.   /** A WritableComparator optimized for RandomDatum. */
  79.   public static class Comparator extends WritableComparator {
  80.     public Comparator() {
  81.       super(RandomDatum.class);
  82.     }
  83.     public int compare(byte[] b1, int s1, int l1,
  84.                        byte[] b2, int s2, int l2) {
  85.       int n1 = readInt(b1, s1);
  86.       int n2 = readInt(b2, s2);
  87.       return compareBytes(b1, s1+4, n1, b2, s2+4, n2);
  88.     }
  89.   }
  90. }