private static void sort(
      final BytesRefBuilder scratch,
      final BytesRefBuilder scratch1,
      final BytesRefArray bytes,
      final int[] indices) {

    final int numValues = bytes.size();
    assert indices.length >= numValues;
    if (numValues > 1) {
      new InPlaceMergeSorter() {
        final Comparator<BytesRef> comparator = BytesRef.getUTF8SortedAsUnicodeComparator();

        @Override
        protected int compare(int i, int j) {
          return comparator.compare(
              bytes.get(scratch, indices[i]), bytes.get(scratch1, indices[j]));
        }

        @Override
        protected void swap(int i, int j) {
          int value_i = indices[i];
          indices[i] = indices[j];
          indices[j] = value_i;
        }
      }.sort(0, numValues);
    }
  }
 public static int sortAndDedup(final BytesRefArray bytes, final int[] indices) {
   final BytesRefBuilder scratch = new BytesRefBuilder();
   final BytesRefBuilder scratch1 = new BytesRefBuilder();
   final int numValues = bytes.size();
   assert indices.length >= numValues;
   if (numValues <= 1) {
     return numValues;
   }
   sort(scratch, scratch1, bytes, indices);
   int uniqueCount = 1;
   BytesRefBuilder previous = scratch;
   BytesRefBuilder current = scratch1;
   bytes.get(previous, indices[0]);
   for (int i = 1; i < numValues; ++i) {
     bytes.get(current, indices[i]);
     if (!previous.get().equals(current.get())) {
       indices[uniqueCount++] = indices[i];
     }
     BytesRefBuilder tmp = previous;
     previous = current;
     current = tmp;
   }
   return uniqueCount;
 }