java:comparable
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
java:comparable [2020/02/25 07:36] – created gthanos | java:comparable [2020/03/15 18:30] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Συγκρίνοντας αντικείμενα μεταξύ τους ====== | ====== Συγκρίνοντας αντικείμενα μεταξύ τους ====== | ||
+ | |||
+ | ===== Το interface java.lang.Comparable ===== | ||
Συχνά προκύπτει η ανάγκη να ταξινομήσουμε αντικείμενα ή να εφαρμόσουμε δυαδική αναζήτηση πάνω σε ένα ήδη ταξινομημένο σύνολο. Προκειμένου να εφαρμόσουμε τους παραπάνω αλγορίθμους είναι αναγκαίο να μπορούμε να συγκρίνουμε αντικείμενα μεταξύ τους. Ας υποθέσουμε ότι έχουμε μια σειρά από αντικείμενα της κλάσης '' | Συχνά προκύπτει η ανάγκη να ταξινομήσουμε αντικείμενα ή να εφαρμόσουμε δυαδική αναζήτηση πάνω σε ένα ήδη ταξινομημένο σύνολο. Προκειμένου να εφαρμόσουμε τους παραπάνω αλγορίθμους είναι αναγκαίο να μπορούμε να συγκρίνουμε αντικείμενα μεταξύ τους. Ας υποθέσουμε ότι έχουμε μια σειρά από αντικείμενα της κλάσης '' | ||
Line 23: | Line 25: | ||
</ | </ | ||
- | <code java Rectangle.java> | + | <code java SortRectangleArray.java> |
import java.util.Random; | import java.util.Random; | ||
+ | import java.util.Arrays; | ||
+ | |||
class SortRectangleArray { | class SortRectangleArray { | ||
- | public static void main(String []args) { | + | |
+ | | ||
Random rand = new Random(12345); | Random rand = new Random(12345); | ||
- | Rectangle []rectangles = new Rectangles[5]; | + | Rectangle []rectangles = new Rectangle[5]; |
for(int i=0;i<5; i++) | for(int i=0;i<5; i++) | ||
rectangles[i] = new Rectangle(rand.nextInt(10), | rectangles[i] = new Rectangle(rand.nextInt(10), | ||
Line 37: | Line 42: | ||
} | } | ||
| | ||
- | public print_rectangles(Rectangle []rectangles) { | + | public |
+ | System.out.println(" | ||
for(int i=0; i< | for(int i=0; i< | ||
System.out.println(i+" | System.out.println(i+" | ||
Line 44: | Line 50: | ||
</ | </ | ||
+ | O παραπάνω κώδικας αν και μεταγλωττίζεται τερματίζει αναπάντεχα με ένα μήνυμα της μορφής: | ||
+ | < | ||
+ | Exception in thread " | ||
+ | at java.base/ | ||
+ | at java.base/ | ||
+ | at java.base/ | ||
+ | at SortRectangleArray.main(SortRectangleArray.java: | ||
+ | </ | ||
+ | |||
+ | Ο λόγος που συμβαίνει αυτό είναι ότι δεν υπάρχει τρόπος να συγκριθούν τα αντικείμενα τύπου '' | ||
+ | * **> 0** έαν το τρέχον αντικείμενο είναι μεγαλύτερο από το '' | ||
+ | * **< 0** εάν το τρέχον αντικείμενο είναι μικρότερο από το '' | ||
+ | * **== 0** εάν το τρέχον αντικείμενο είναι ίσο με το '' | ||
+ | |||
+ | Το κριτήριο μέσω του οποίου θα συγκρίνετε δύο αντικείμενα τύπου '' | ||
+ | |||
+ | <code java> | ||
+ | public int compareTo(Rectangle r) { | ||
+ | return this.area() - r.area(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Επίσης, | ||
+ | |||
+ | <code java Rectangle.java> | ||
+ | class Rectangle implements java.lang.Comparable< | ||
+ | | ||
+ | int width; | ||
+ | int height; | ||
+ | |||
+ | public Rectangle(int initWidth, int initHeight) { | ||
+ | width = initWidth; | ||
+ | height = initHeight; | ||
+ | } | ||
+ | | ||
+ | int area() { | ||
+ | return width * height; | ||
+ | } | ||
+ | public String toString() { | ||
+ | return " | ||
+ | } | ||
+ | | ||
+ | public int compareTo(Rectangle r) { | ||
+ | return this.area() - r.area(); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <WRAP tip 80% center round> | ||
+ | Οι βασικές κλάσεις του πακέτου java.lang (String, | ||
+ | </ | ||
+ | |||
+ | ===== Το interface java.util.Comparator ===== | ||
+ | |||
+ | Στο προηγούμενο παράδειγμα, | ||
+ | |||
+ | <code java RectangleComparator.java> | ||
+ | public class RectangleComparator implements java.util.Comparator< | ||
+ | | ||
+ | public int compare(Rectangle r1, Rectangle r2) { | ||
+ | return r1.height - r2.height; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | και στη μέθοδο main να καλέσουμε την παραλλαγή της sort ως εξης: | ||
+ | <code java> | ||
+ | Arrays.sort(rectangles, | ||
+ | </ | ||
+ | |||
+ | <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), | ||
+ | | ||
+ | print_rectangles(rectangles); | ||
+ | Arrays.sort(rectangles, | ||
+ | print_rectangles(rectangles); | ||
+ | } | ||
+ | | ||
+ | public static void print_rectangles(Rectangle []rectangles) { | ||
+ | System.out.println(" | ||
+ | for(int i=0; i< | ||
+ | System.out.println(i+" | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Παρατηρείτε ότι η σειρά της τελικής κατάταξης των αντικειμένων αλλάζει. Αγνοείται η σειρά κατάταξης που δημιουργεί η μέθοδος '' | ||
+ | |||
+ | <WRAP tip 80% center round> | ||
+ | Ο παραπάνω τρόπος σύγκρισης έχει ιδιαίτερη χρησιμότητα όταν έχουμε κλάσεις των οποίων θέλουμε να συγκρίνουμε τα αντικείμενα μεταξύ τους, αλλά οι κλάσεις αυτές δεν υλοποιούν το interface java.lang.Comparable. | ||
+ | </ | ||
+ | | Προηγούμενο : [[ : |
java/comparable.1582616185.txt.gz · Last modified: 2020/02/25 07:36 (external edit)