Search code examples
javaarrayscomparator

Java Comparator Issue (Compare twice)


I have an array of objects called array and have 3 items in it, which are: id, numAccess and numDelete (all in primitive int). What I want to do: sort first by numAccess then by numDelete.

for(int i=1; i<=n; i++){
     System.out.println("ID: " + array[i].id + " numAccess: " + array[i].numAccess + " numDelete: " + array[i].numDelete);
}

Arrays.sort(array, new Comparator<Process>(){
     public int compare(Process p1, Process p2) {
          Integer compr = Integer.valueOf(p1.numAccess).compareTo(Integer.valueOf(p2.numAccess));
        
          if (compr != 0) {
               return compr;
          } 
        
          return Integer.valueOf(p1.numDelete).compareTo(Integer.valueOf(p2.numDelete)); 
     }
});

for(int i=1; i<=n; i++){
      System.out.println("ID: " + array[i].id + " numAccess: " + array[i].numAccess + " numDelete: " + array[i].numDelete);
}

Let's say if before sort is this:

ID: 1 numAccess: 0 numDelete: 8
ID: 2 numAccess: 4 numDelete: 15
ID: 3 numAccess: 7 numDelete: 9
ID: 4 numAccess: 13 numDelete: 5
ID: 5 numAccess: 9 numDelete: 13
ID: 6 numAccess: 0 numDelete: 6

Then desired after sort should be:

ID: 6 numAccess: 0 numDelete: 6
ID: 1 numAccess: 0 numDelete: 8
ID: 2 numAccess: 4 numDelete: 15
ID: 3 numAccess: 7 numDelete: 9
ID: 5 numAccess: 9 numDelete: 13
ID: 4 numAccess: 13 numDelete: 5

However, what I get is this:

ID: 0 numAccess: 0 numDelete: 0
ID: 0 numAccess: 0 numDelete: 0
ID: 0 numAccess: 0 numDelete: 0
ID: 6 numAccess: 0 numDelete: 6
ID: 1 numAccess: 0 numDelete: 8
ID: 2 numAccess: 4 numDelete: 15

I couldn't figure out what's wrong. May I get some advice? Thank you very much.


Solution

  • If you want to only sort part of the array (from index 1 to n inclusive) you can use Arrays.sort(array, 1, n+1, comparator);

    Also note that your comparator implementation is unnecessarily complex. You can replace

    Integer compr = Integer.valueOf(p1.numAccess).compareTo(Integer.valueOf(p2.numAccess));
    

    with

    int compr = Integer.compare(p1.numAccess, p2.numAccess));