2 Stimmen

Wie man eine vordefinierte Klasse implementiert, die Collections implementiert

Dies ist ein Hausaufgabenproblem, mit dem ich Schwierigkeiten habe. Der Skelett für die Klasse ist unten angegeben:

public class Storage implements java.util.Collection {
private Object[] data = new Object[256];
private int nextEmptySlot = 0;

@Override
public java.util.Iterator iterator() {
    // gibt eine Klasse zurück, die über das Datenfeld iteriert
    return new java.util.Iterator() {
        // füge den Körper der inneren Klasse hier ein
        // 3 Methoden: remove(), hasNext(), next()
        };
    }
//Alle Methoden, die durch das Interface erforderlich sind, überschreiben
}

Das Problem, das ich jetzt habe, ist das Schreiben von Funktionen wie contains(Object o), da die Vorlage E nicht zwingend vergleichbar macht. Wie kann ich den generischen Typ E als vergleichbar behandeln, damit ich equals und compareTo verwenden kann? Ich weiß, dass es Möglichkeiten gibt, dies in der Klassendeklaration zu tun, aber die Klassendeklaration wird gegeben und erfordert nicht, dass E vergleichbar ist...

3voto

Jim Garrison Punkte 83143

Die einzigen Sammlungen, die eine Ordnung implementieren, sind SortedMap und SortedSet, und keines davon legt eine Grenze für den Typenparameter fest. Intern würde ich vermuten, dass es zu Comparable umwandelt und die ClassCastException wirft, wenn das fehlschlägt. Die ungeordneten Sammlungen hängen nur von equals() und hashCode() ab und benötigen kein Comparable.

3voto

pseudoramble Punkte 2491

Sie sollten compareTo() nicht benötigen, da dies Ihnen eine Definition der Reihenfolge der Elemente geben würde (obwohl es Ihnen sagen kann, ob zwei Objekte gleich sind). Es sei denn, die Reihenfolge ist hier wichtig, das wäre sowieso nicht das, was Sie wollen.

Wenn die Annahme richtig ist, dass die Reihenfolge nicht erforderlich ist, sollten Sie sich nur auf die equals()-Methode jeder Instanz innerhalb der Sammlung verlassen.

  1. Wenn E die equals() und hashCode()-Methoden ordnungsgemäß überschreibt, kann E selbst bestimmen, ob das Element in dieser Sammlung enthalten ist.
  2. Wenn es die equals()-Methode nicht überschrieben hat, wird die Instanz auf die Implementierung von equals() von Object zurückgreifen, die einfach die Referenzen vergleicht (wenn sie beide nicht NULL sind).

Ich würde vorschlagen, zunächst sicherzustellen, dass Sie die Anforderungen dieser Aufgabe klar verstehen. Wenn die Anforderungen etwas spezifischer sind, können Sie möglicherweise feststellen, was Gleichheit innerhalb Ihrer Sammlung bedeutet. Wenn Sie nichts klareres erhalten können, glaube ich, dass Ihre einzige Wahl darin besteht, sich auf die Implementierung von equals() von E zu verlassen.

0voto

Jeff Storey Punkte 54752

Sie können den Typ E begrenzen

public class Storage implementiert java.util.Collection

Und Sie können das Comparable nach Bedarf parametrisieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X