2017-05-21 2 views
0

das ist meine Hauptstruktur: Einige der Schnittstellenmethoden sind in Klasse A implementiert, alle anderen sind in Unterklassen implementiert.Sort ArrayList von Objekten, die Instanzen von Unterklassen der abstrakten Klasse sind

public interface I 
{ 
// some methods 
// 
} 

public abstract class A implements I 
{ 
// some variables and methods 
// 
} 

public class B extends A 
{ 
// some variables and methods 
// 
} 

public class C extends A 
{ 
// some variables and methods 
// 
} 

public abstract class D extends A 
{ 
// some variables and methods 
// 
} 


public class Test 
{ 
public static void main(String[] args) 
{ 
    ArrayList<I> la = new ArrayList<I>(); 
    la.add(new B(..)); 
    la.add(new C(..)); 
    la.add(new C(..)); 
    la.add(new B(..)); 
    la.add(new E(..)); 
} 
} 

Es gibt Konstrukteuren in B, C und E-Klassen.

Ich muss la von Variable der Klasse A sortieren, die Variable ist Int-Datentyp.

Ich versuche, in allen nicht abstrakten Klassen wegen fehlender public int compareTo(A o) Methode

public abstract class A implements I, Comparable<A> 

Aber ich erhalte eine Fehlermeldung zu ändern.

Was muss ich tun?

Danke.

+0

Wenn einige, was fehlt, ist die Methode geändert dann, wie die Idee ist es, die fehlende Einheit hinzuzufügen. –

+0

Das Sortieren von Objekten Ihrer Klassen basiert auf Ihrer Logik. JVM kann es nicht magisch für Sie definieren. Sie müssen es irgendwo definieren. Wenn Sie die Vergleichsschnittstelle implementieren, müssen Sie die Vergleichslogik in der implwmwntation ihrer abstrakten Methode 'compareTo' definieren. Sie müssen die Implementierung für die Methode bereitstellen. Fügen Sie es hinzu, implementieren Sie die Logik für den Vergleich. Vielleicht können Sie entweder das Problem lösen oder Sie haben eine * aussagekräftige * und * spezifische * Frage. –

+1

so muss ich implementieren public int compareTo (A 0) in Klasse A? – Asaf

Antwort

0
public abstract class A implements I, Comparable<A> { 
    // some variables and methods 

    @Override 
    public int compareTo(A o) { 
     return someVariable - o.someVariable; 
    } 
} 

Sie können keinen Konstruktor in A brauchen eine compareTo Methode zu implementieren, und Sie haben einige Variablen bekommen Sie zum Vergleich verwenden. compareTo ist nur eine Methode, also da Sie Methoden in A haben können, können Sie auch eine compareTo Methode haben. Da ich nicht weiß, welche Variablen Sie haben oder welche Sortierreihenfolge Sie benötigen, müssen Sie die Methode selbst ausfüllen.

Auf der anderen Seite könnte es gut sein, einen Konstruktor in A zu haben, aber das ist eine völlig unabhängige Frage.

Edit: Ich habe nicht gedacht, dies zunächst durch: Sie natürlich wollen

Collections.sort(la); 

Dies ist nicht so einfach zu tun, wie es klingen mag. Collections.sort() ist eine generische Methode deklariert nach the docs als:

static <T extends Comparable<? super T>> void sort(List<T> list) 

Dies bedeutet, dass der Compiler über einen Aufruf der Methode, glücklich zu sein, das erklärte Elementtyp der Liste ein, die für eine Art implementiert Comparable<U> sein muss U das ist entweder der Elementtyp oder ein Supertyp davon. Ihr Elementtyp ist I und I implementiert Comparable nicht. Deshalb erhalten Sie die Fehlermeldung.

Die Lösung? Ich glaube nicht, dass die perfekte Lösung existiert.Vorausgesetzt, dass Sie nicht la eine ArrayList<A> deklarieren möchten, eine weitere Option ist zu erklären, dass I vergleichbar ist:

public interface I extends Comparable<I> 

Genau dies spricht mehr verspricht, über A als wir erfüllen können. Wir können zwei A Objekte vergleichen (auch wenn sie Instanzen von Unterklassen von A sind), aber es könnte andere Implementierungen von I geben, und wir können nicht wissen, wie man sie mit A vergleicht. Ein Ausweg ist:

@Override 
public int compareTo(I o) { 
    A oa = (A) o; // will throw ClassCastException if o is not an A 
    return someVariable - oa.someVariable; 
} 

Seit A erstreckt I und I erstreckt Comparable<I>, müssen wir jetzt erklären o ein I, kein A. Wenn jemand uns eine fremde I Implementierung gibt, werfen wir eine ClassCastException, und die Sortierung würde diese an den Aufrufer weitergeben. Wir wissen jedoch, dass in Ihrer Liste alle Elemente Instanzen von Unterklassen A sind, das wird also nicht passieren. Mit dem oben genannten funktioniert sowohl Ihr Anruf an S.sortBySome() als auch sein Anruf an Collections.sort().

+0

Ich füge diese Methode zu Klasse A. Die Arraylist 'la' aus dem Haupt, übertrage ich es auf eine statische Methode aus einer anderen Klasse im Paket. In der Hauptmethode verwende ich foreach, um alle Instanzen in sortierter Reihenfolge nach einer Variablen zu drucken. 'public class S { \t public static Arraylist sortBySome (Arraylist la) \t { \t} } ' so füge ich dies dem Verfahren: '\t \t Arraylist obj = new Arraylist (); \t \t \t Sammlungen.sort (la); ' Aber ich bekomme einen Fehler bei der Sortiermethode. 'Die Methode sort (Liste ) im Typ Collections ist nicht anwendbar für die Argumente (ArrayList )' Warum ist das? – Asaf

+0

Ich bekomme die gleiche Fehlermeldung. Sehen Sie meine Bearbeitung für eine Erklärung und eine Möglichkeit, um es zu umgehen. –

0

Ich löste es durch public interface I extends Comparable<I> und in der Klasse A Hinzufügen I compareTo zu

public int compareTo(I obj) 
{ 
    return someVariable - obj.someVariable; 
} 
Verwandte Themen