Frage zur konkreten Methodenimplementierung

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

ich habe folgenden Code vorliegen:

Code:
Arrays.sort(Datei, new Comparator() {public int compare(Object a, Object b) {
				meinHandler f1 = new meinHandler((String) a);
				meinHandler f2 = new meinHandler((String) b);
				if (f1.date.compareTo(f2.date) != 0) {
					return f1.date.compareTo(f2.date);
				} else {
					return f1.dateiart.compareTo(f2.dateiart);
				}
			           }
		                          })

ich weiss was der Code macht, aber leider verstehe ich den Code syntaktisch nicht ganz. Also:
1. die Methode Arrays.sort erhält 2 Parameter übergeben.

2. der 2. Parameter ist mir gänzlich unbekannt. Was wird denn hier gemacht?
Aus dem ersten Blick sieht dies nach einem Objekt von der Klasse Comparator. Ich habe in die Doku nachgeschlagen --> Comparator ist ein Interface. Und soweit ich weiss kann ein Interface nicht instantiiert werden. Warum dann new Comparator( ) ****?

3. noch verwirrender für mich ist was danach folgt:
Code:
public int compare(Object a, Object b) {...}
Hier wird ja eine Methode deklariert und definiert. Wie ist das möglich?

Könnte mir jemand bitte helfen? Vielen Dank.

Schöne Grüße aus Rheinland,

Eure Ratna
 
Also da wird als 2. Parameter eine Classe erzeugt die das Interface Comperator implementiert.
Das Interface sieht ja vor das eine Function int compare(a,b); vorhanden sein muss.

Da die Classe direkt erzeugt wird hat die auch kein namen ...

Code:
class bla implements Comperator {
int compare(Object a, Object b) {
//code
}
}

Code:
Arrays.sort(Datei, new bla())
so würde ja die Classe ausehen wenn sie einen Namen erhalten würde

sprich in dem Fall fällt einfach das einleitende "class bla implements" schlicht und einfach weg

sowas wirste oft sehen das eine Classe direkt erzeugt wird, grade bei Swing ist das eine gängige Art und Weise
 
Zuletzt bearbeitet:
Hallo melmager,

danke für die rasche Antwort.

"Da die Classe direkt erzeugt wird hat die auch kein namen "

mhh.. welche Klasse wird hier direkt erzeugt? Ich dachte, hier wurde ein Objekt erzeugt?

Vielen Dank.

Schöne Grüße aus Rheinland,

Eure Ratna
 
Also new bla();
erzeugt ja ein Objekt der Classe Bla
und in deinem Code wird ein Ojekt einer namenlose Classe erzeugt die das Interface implementiert.

Ich dachte es es wurde verständlicher durch mein aufdröseln - sprich wenn man das über eine "normale" classe machen würde.
Die Classe wird also namenlos (bzw ein Objekt davon) direkt erzeugt und somit muss natürlich auch die gefordertet Function des Interfaces implementiert werden.

Code:
new Comparator() { //.....
classe wird erzeugt

Code:
//....
public int compare(Object a, Object b) { //..

die geforderte Function wird implementiert
 
Zuletzt bearbeitet:
Kürzen bei Classen
Code:
Bla var = new Bla();
//... snipp
Arrays.sort(Datei, var);
Einsparen des Objekts var der classe Bla
Code:
Arrays.sort(Datei, new Bla());
Einsparen der Classendefination
Code:
Arrays.sort(Datei, new /*class bla implements */ Comperator () {
  public int compare(Object a, Object b) {
    //code function
  } // function ende
 } // class ende
) // klammer zu von sort

"/*class bla implements */" fällt weg ist nur zur klarstellung was da passiert
 
Zuletzt bearbeitet:
Aber vielleicht noch ganz kurz. Was haben die eckigen Klammer in der Doku zu bedeuten:

Interface Comparator<T>

Type Parameters:
T - the type of objects that may be compared by this comparator

Leider bin ich trotz der Beschreibung auf Englisch nicht schlau geworden.
 
Mhh.. ich dachte, ich hätte eigentlich verstanden, was Interface bzw. implements bedeutet, aber diese Variante macht mich wieder down :(
Den Beispiel-Code habe ich im Netz gefunden:

Code:
class Dog implements Comparator<Dog>, Comparable<Dog>{
   private String name;
   private int age;
   Dog(){
   }

   Dog(String n, int a){
      name = n;
      age = a;
   }

   public String getDogName(){
      return name;
   }

   public int getDogAge(){
      return age;
   }

   // Overriding the compareTo method
   public int compareTo(Dog d){
      return (this.name).compareTo(d.name);
   }

   // Overriding the compare method to sort the age 
   public int compare(Dog d, Dog d1){
      return d.age - d1.age;
   }
}

Die Stelle, die mich stutzig macht ist die hier:

Code:
class Dog implements Comparator<Dog>, Comparable<Dog>{
   private String name;
   private int age;
   Dog(){
   }

2 mal Comparator<Dog> ?
Was hat dies zu bedeuten?

Vielen Dank, zusammen.

Schöne Grüße aus Rheinland,

Eure Ratna
 
Zum Comparator<T>:
In einer Klasse/Interface/wasauchimmer mit so einem <T> dabei
kann man beim Schreiben der Klasse "T" als einen Variablentyp verwenden.
int, Comparator, Dog...und jetzt eben ein T.

Man weiß zuerst nicht, was das T eigentlich ist; schreibt seine Klasse also so,
dass es möglichst mit allen T´s umgehen kann.
Und beim Anlegen etc. von tatsächlichen Objekten kann man dann
Comparator<int>, Comparator<Dog>, Comparator<irgendwas> schreiben,
wobei das dann für T "eingesetzt" wird.

Man kann also eine Klasse, bei der es Sinn macht, für alle möglichen Typen schreiben,
auch die die es zum Erstellzeitpunkt noch nicht gibt,
die ein anderer Programmierer irgendwann haben wird, wenn er deine Klasse verwendet usw.

zB. wenn man sich eine Arrayklasse machen würde
und die ein paar Methoden wie zähle, sortiere usw. anbietet
macht man ein Array aus T´s und lasst den Verwender mit MeinArray<float> bestimmen,
dass er eben ein float-Array haben will.


Zum zweiten Beitrag:
Comparator und Comparable sind verschiedene Sachen.
 
Hallo zusammen,

@sheel, vielen Dank für die Erklärung. Trotzdem bin ich noch etwas verzweifelt:

Code:
Arrays.sort(Datei, new Comparator() {public int compare(Object a, Object b) {
                meinHandler f1 = new meinHandler((String) a);
                meinHandler f2 = new meinHandler((String) b);
                if (f1.date.compareTo(f2.date) != 0) {
                    return f1.date.compareTo(f2.date);
                } else {
                    return f1.dateiart.compareTo(f2.dateiart);
                }
                       }
                                  })

es wurde ja gesagt dass mit new Comparator() ein Objekt einer namenlosen Klasse, die Comparator implementiert, erzeugt wird. Welche Datentyp hat diese namenlose Klasse? Ich nehme an, Object? Object implements also Comparator?
Ich bin etwas verwirrt, aber komischerweise verstehe ich folgendes:

Code:
class Stammbaum<T>{ 
.... 
public void addMember(T member); 
... 
}  

Stammbaum<Person> familie = new Stammbaum<Person>();
Stammbaum<Hund> familie_01 = new Stammbaum<Hund>();

Ist es möglich, den ersten Code so umzuformulieren, dass er die Struktur von dem 2. Code hat?

Vielen Dank.

Schöne Grüße aus Rheinland,

Eure Ratna
 

Neue Beiträge

Zurück