//sortAry.java  -- CopyLeft by tsaiwn@csie.nctu.edu.tw
//use Arrays.sort( ) to sort an array of some Object
//Note java.lang.Comparable, java.util.Comparator
import java.util.*;
class sortAry {
    java.io.PrintStream cout = System.out;
    public static void main(String xx[ ]) {
        new sortAry( ); 
    }
    public sortAry( ) { main( ); }  // constructor ; call int main( ); 
    int main( ) {
       String n[ ]={"abc", "bbs", "aaaaa", "cat", "hat", "dog", "god"};
       int ht[ ] = { 168, 158, 180, 175, 173, 165, 163 };
       double wt[ ] = { 88.5, 75, 76.5, 66, 68, 70, 60, 99, 33};
       ST s[ ] = new ST[7];
       for(int i=0; i<7; ++i)
          s[i] = new ST(n[i], ht[i], wt[i]);   // name, height, weight
       cout.printf("Original s: \n"); print(s);
       Arrays.sort(s);
       cout.println("\nafter Arrays.sort(s);: "); print(s);
       God arben = new God( );   // arben is a Comparator
       Arrays.sort(s, arben);
       cout.println("after Arrays.sort(s, arben);: "); print(s); 
       Arrays.sort(s, Collections.reverseOrder(arben));
       cout.print("after Arrays.sort(s, ");
       cout.println("Collections.reverseOrder(arben)); : ");
       print(s); 
       //Java can NOT pass a compare function to sort program
       return 0;
    }// int main( )
  void print(ST x[ ]) {  // print array of ST, 但故意少印兩個元素
    cout.print(" "+x[0].name+" "+x[0].height+" "+x[0].wet);
    for(int i=1; i < x.length-2; ++i)
       cout.print(", "+x[i].name+" "+x[i].height+" "+x[i].wet);
    cout.println( );
  }//print(ST
}//class
class ST  implements Comparable {
   ST(String a, int b, double c) {
     name=a; height=b; wet=c;
   }
   public int compareTo(Object bb) {
       ST b = (ST)bb;  System.out.print(". ");
       return this.height - b.height;
   }
   String name; int height; double wet;
}//ST
class God implements Comparator <ST>{
    public int compare(ST aa, ST bb){
       if( aa.wet == bb.wet) return 0;
       if( aa.wet > bb.wet) return -1;  // Descending on wet
       return 1;
    }
}//class God
/*********************
D:\COURSE\OOP\ppnt>javac sortAry.java

D:\COURSE\OOP\ppnt>java sortAry
Original s:
 abc 168 88.5, bbs 158 75.0, aaaaa 180 76.5, cat 175 66.0, hat 173 68.0
. . . . . . . . . . . . . . .
after Arrays.sort(s);:
 bbs 158 75.0, god 163 60.0, dog 165 70.0, abc 168 88.5, hat 173 68.0
after Arrays.sort(s, arben);:
 abc 168 88.5, aaaaa 180 76.5, bbs 158 75.0, dog 165 70.0, hat 173 68.0
after Arrays.sort(s, Collections.reverseOrder(arben)); :
 god 163 60.0, cat 175 66.0, hat 173 68.0, dog 165 70.0, bbs 158 75.0
*************************/
