@Override
 public int compareTo(StringTuple otherTuple) {
   int thisLength = length();
   int otherLength = otherTuple.length();
   int min = Math.min(thisLength, otherLength);
   for (int i = 0; i < min; i++) {
     int ret = this.tuple.get(i).compareTo(otherTuple.stringAt(i));
     if (ret != 0) {
       return ret;
     }
   }
   if (thisLength < otherLength) {
     return -1;
   } else if (thisLength > otherLength) {
     return 1;
   } else {
     return 0;
   }
 }
  @Override
  protected void map(Text key, StringTuple value, final Context context)
      throws IOException, InterruptedException {
    HashMap<String, Long> wordCount = new HashMap<String, Long>();
    for (String word : value.getEntries()) {
      if (wordCount.containsKey(word)) {
        wordCount.put(word, wordCount.get(word) + 1);
      } else {
        wordCount.put(word, (long) 1);
      }
    }

    for (Entry<String, Long> entry : wordCount.entrySet()) {
      try {
        context.write(new Text(entry.getKey()), new LongWritable(entry.getValue()));
      } catch (IOException e) {
        context.getCounter("Exception", "Output IO Exception").increment(1);
      } catch (InterruptedException e) {
        context.getCounter("Exception", "Interrupted Exception").increment(1);
      }
    }
  }