title: Determine ranking of generic comparable array
body: <p>If have this code (taken from <a href="https://stackoverflow.com/a/4859279/1178781">https://stackoverflow.com/a/4859279/1178781</a>):</p>
  
  <pre class="lang-java prettyprint-override"><code>import java.util.Comparator;
  
  public class ArrayIndexComparator&lt;T extends Comparable&lt;? super T&gt;&gt; implements
          Comparator&lt;Integer&gt; {
      private final T[] array;
  
      public ArrayIndexComparator(T[] array) {
          this.array = array;
      }
  
      public Integer[] createIndexArray() {
          Integer[] indexes = new Integer[array.length];
          for (int i = 0; i &lt; array.length; i++) {
              indexes[i] = i; // Autoboxing
          }
          return indexes;
      }
  
      @Override
      public int compare(Integer index1, Integer index2) {
          // Autounbox from Integer to int to use as array indexes
          return array[index1].compareTo(array[index2]);
      }
  }
  </code></pre>
  
  <p>When I run the program this happens:</p>
  
  <pre class="lang-java prettyprint-override"><code>import java.util.Arrays;
  import java.util.Comparator;
  
  public class Launcher {
  
      /**
       * @param args
       */
      public static void main(String[] args) {
          String[] countries = { "A", "H", "E", "C", "D", "F", "G", "B" };
          ArrayIndexComparator&lt;String&gt; comparator = new ArrayIndexComparator&lt;String&gt;(
                  countries);
          Integer[] indexes = comparator.createIndexArray();
          Arrays.sort(indexes, comparator);
          System.out.print("Array:    ");
          System.out.println(Arrays.toString(countries));
          System.out.print("Rankings: ");
          System.out.println(Arrays.toString(indexes));
          System.out.println("");
  
          final Float[] scores2 = { 2.3f, 0.7f, 1.4f, 1.2f };
          ArrayIndexComparator&lt;Float&gt; comparator2 = new ArrayIndexComparator&lt;Float&gt;(
                  scores2);
          indexes = comparator2.createIndexArray();
          Arrays.sort(indexes, comparator2);
          System.out.print("Array:    ");
          System.out.println(Arrays.toString(scores2));
          System.out.print("Rankings: ");
          System.out.println(Arrays.toString(indexes));
          System.out.println("");
  
          final Integer[] scores3 = { 1, 2, 0, 3 };
          ArrayIndexComparator&lt;Integer&gt; comparator3 = new ArrayIndexComparator&lt;Integer&gt;(
                  scores3);
          indexes = comparator3.createIndexArray();
          Arrays.sort(indexes, comparator3);
          System.out.print("Array:    ");
          System.out.println(Arrays.toString(scores3));
          System.out.print("Rankings: ");
          System.out.println(Arrays.toString(indexes));
          System.out.println("");
  
          final Integer[] scores4 = { 1, 0, 2, 3 };
          ArrayIndexComparator&lt;Integer&gt; comparator4 = new ArrayIndexComparator&lt;Integer&gt;(
                  scores4);
          indexes = comparator4.createIndexArray();
          Arrays.sort(indexes, comparator4);
          System.out.print("Array:    ");
          System.out.println(Arrays.toString(scores4));
          System.out.print("Rankings: ");
          System.out.println(Arrays.toString(indexes));
          System.out.println("");
  
      }
  
  }
  </code></pre>
  
  <p>The output is as follows:</p>
  
  <pre class="lang-java prettyprint-override"><code>Array:    [A, H, E, C, D, F, G, B]
  Rankings: [0, 7, 3, 4, 2, 5, 6, 1]
  
  Array:    [2.3, 0.7, 1.4, 1.2]
  Rankings: [1, 3, 2, 0]
  
  Array:    [1, 2, 0, 3]
  Rankings: [2, 0, 1, 3]
  
  Array:    [1, 0, 2, 3]
  Rankings: [1, 0, 2, 3]
  </code></pre>
  
  <p>I thought that this should correctly give the Rankings of the objects in the array, but certain configurations do not do that.  Am I missing something? Or is this not actually sorting to give Rankings, but something else?</p>
  
  <p>For example:</p>
  
  <pre class="lang-java prettyprint-override"><code>Array:    [A, H, E, C, D, F, G, B]
  Rankings: [0, 7, 3, 4, 2, 5, 6, 1]
  Should be:[0, 7, 4, 2, 3, 5, 6, 1]
  
  Array:    [2.3, 0.7, 1.4, 1.2]
  Rankings: [1, 3, 2, 0]
  Should be:[3, 0, 2, 1]
  
  Array:    [1, 2, 0, 3]
  Rankings: [2, 0, 1, 3]
  Should be:[1, 2, 0, 3]    
  
  Array:    [1, 0, 2, 3]
  Rankings: [1, 0, 2, 3]
  Should be:[1, 0, 2, 3]
  </code></pre>