User Tools

Site Tools


java:comparable

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

java:comparable [2020/02/25 07:58]
gthanos
java:comparable [2020/03/15 18:30]
Line 1: Line 1:
-====== Συγκρίνοντας αντικείμενα μεταξύ τους ====== 
- 
-Συχνά προκύπτει η ανάγκη να ταξινομήσουμε αντικείμενα ή να εφαρμόσουμε δυαδική αναζήτηση πάνω σε ένα ήδη ταξινομημένο σύνολο. Προκειμένου να εφαρμόσουμε τους παραπάνω αλγορίθμους είναι αναγκαίο να μπορούμε να συγκρίνουμε αντικείμενα μεταξύ τους. Ας υποθέσουμε ότι έχουμε μια σειρά από αντικείμενα της κλάσης ''Rectangle'' τα οποία θέλουμε να ταξινομήσουμε όπως παρακάτω: 
- 
-<code java Rectangle.java> 
-class Rectangle { 
-     
-  int width; 
-  int height; 
-  
-  public Rectangle(int initWidth, int initHeight) { 
-    width = initWidth; 
-    height = initHeight; 
-  } 
-   
-  int area() { 
-    return width * height; 
-  } 
-  public String toString() { 
-    return "width: "+width+", height: "+height; 
-  } 
-} 
-</code> 
- 
-<code java SortRectangleArray.java> 
-import java.util.Random; 
-import java.util.Arrays; 
- 
-class SortRectangleArray { 
-   
-    public static void main(String []args) { 
-    Random rand = new Random(12345); 
-    Rectangle []rectangles = new Rectangle[5]; 
-    for(int i=0;i<5; i++) 
-      rectangles[i] = new Rectangle(rand.nextInt(10), rand.nextInt(10)); 
-       
-    print_rectangles(rectangles); 
-    Arrays.sort(rectangles); 
-    print_rectangles(rectangles); 
-  } 
-   
-  public static void print_rectangles(Rectangle []rectangles) { 
-    for(int i=0; i<rectangles.length; i++) 
-      System.out.println(i+". "+rectangles[i].toString()); 
-  } 
-} 
-</code> 
- 
-O παραπάνω κώδικας αν και μεταγλωττίζεται τερματίζει αναπάντεχα με ένα μήνυμα της μορφής: 
-<code> 
-Exception in thread "main" java.lang.ClassCastException: class Rectangle cannot be cast to class java.lang.Comparable (Rectangle is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap') 
- at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320) 
- at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188) 
- at java.base/java.util.Arrays.sort(Arrays.java:1250) 
- at SortRectangleArray.main(SortRectangleArray.java:13) 
-</code> 
- 
-Ο λόγος που συμβαίνει αυτό είναι ότι δεν υπάρχει τρόπος να συγκριθούν τα αντικείμενα τύπου ''Rectangle'' μεταξύ τους. Προκειμένου να επιτευχθεί η σύγκριση, η Java αναμένει η κλάση ''Rectangle'' να υλοποιεί το interface [[https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html|java.lang.Comparable]]. Το interface [[https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html|java.lang.Comparable]] απαιτεί να υλοποιήσετε τη μέθοδο ''int compareTo(Rectangle r)'', η οποία επιστρέφει:  
-  * **>0** έαν το τρέχον αντικείμενο είναι μεγαλύτερο από το ''r'',  
-  * **<0** εάν το τρέχον αντικείμενο είναι μικρότερο από το ''r''. 
-  * **==0** εάν το τρέχον αντικείμενο είναι ίσο με το ''r''. 
- 
-Το κριτήριο μέσω του οποίου θα συγκρίνετε δύο αντικείμενα τύπου ''Rectangle'' δεν προσδιορίζεται. Ας υποθέσουμε ότι θέλουμε να κατατάξουμε τα αντικείμεμενα τύπου ''Rectangle'' με βάση το εμβαδό τους. Μπορούμε να γράψουμε τη συνάρτηση compareTo εντός της κλάση ''Rectangle'' ως εξής: 
- 
-<code java> 
-  public int compareTo(Rectangle r) { 
-    return this.area() - r.area(); 
-  } 
-</code> 
- 
-Επίσης, δεν πρέπει να παραλήψουμε να δηλώσουμε ότι η κλάση ''Rectangle'' υλοποιεί το συγκεκριμένο interface. Συνολικά η κλάση ''Rectangle'' γράφεται ως εξής: 
- 
-<code java Rectangle.java> 
-class Rectangle implements java.lang.Comparable<Rectangle> { 
-     
-  int width; 
-  int height; 
-  
-  public Rectangle(int initWidth, int initHeight) { 
-    width = initWidth; 
-    height = initHeight; 
-  } 
-   
-  int area() { 
-    return width * height; 
-  } 
-  public String toString() { 
-    return "width: "+width+", height: "+height; 
-  } 
-   
-  public int compareTo(Rectangle r) { 
-    return this.area() - r.area(); 
-  } 
-} 
-</code> 
  
java/comparable.txt · Last modified: 2020/03/15 18:30 (external edit)