Collections Generische Klasse/Methoden

faulix

Mitglied
(Code unten)

Hallo,

ich möchte im Grunde über die zwei Set-Methoden jeweils die LinkedList speichern und über get-Methode die Daten auslesen. Dazu muss ich sie jedoch generisch in der Klasse speichern (dass man in der gesamten Klasse darauf zugreifen kann) und da habe ich die Probleme. Wie erzeuge ich die Variablen klassenweit generisch, denn so wie ich es mache muss ich oft Typ-Casting machen und bei einer Set-Methode geht dadurch der Comperator verloren, den ich jedoch benötige.

Ich hoffe ich konnte mein Problem darlegen und jemand kann mir etwas helfen.

Grüße faulix

Java:
package solutions;

import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import meinpaket.AbsSort;

public class Solution06 extends AbsSort {

	private LinkedList<?> classList;
	private Comparator<?> classComparator;
	
	@Override
	public <T> List<T> getData() {
		if (classList != null) {
			return this.classList;
		}
		return null;
	}

	@Override
	public Object getMax() {
		if (this.classList != null) {
			Iterator<K> items = this.classList.iterator();
			if (items.hasNext()) {
				K actualMax = items.next();
				while (items.hasNext()) {
					K item = items.next();
					if (this.classComparator.compare(actualMax, item) == -1) {
						actualMax = item;
					}
				}
				return actualMax;
			}
		}
		return null;
	}

	@Override
	public Object getMin() {
		if (this.classList != null) {
			Iterator<K> items = this.classList.iterator();
			if (items.hasNext()) {
				K actualMin = items.next();
				while (items.hasNext()) {
					K item = items.next();
					if (this.classComparator != null && this.classComparator.compare(actualMin, item) == 1) {
						actualMin = item;
					}
				}
				return actualMin;
			}
		}
		return null;
	}

	@Override
	public <T extends Comparable<T>> void setData(Collection<T> arg0) {
		if (arg0 != null) {
			this.classList = new LinkedList<K>();
			Iterator<T> items = arg0.iterator();
			while (items.hasNext()) {
				T item = items.next();
				this.classList.add((K) item);
			}
		}

	}

	@Override
	public <T> void setData(Collection<T> arg0, Comparator<T> arg1) {
		if (arg0 != null && arg1 != null) {
			this.classList = new LinkedList<K>();
			Iterator<T> items = arg0.iterator();
			while (items.hasNext()) {
				T item = items.next();
				this.classList.add((K) item);
			}
			this.classComparator = (Comparator<K>) arg1;
		}
	}

	@Override
	public void sort() {
		LinkedList<K> newList = new LinkedList<K>();
		while (this.classList != null && !this.classList.isEmpty())  {
			K actualMin = (K) this.getMin();
			newList.add(actualMin);
			this.classList.remove(actualMin);
		}
		this.classList.addAll(newList);
	}

	@Override
	public String[] getAuthors() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getTeam() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getVersion() {
		// TODO Auto-generated method stub
		return null;
	}

}
 

Marco13

Top Contributor
Die Basisklasse "AbsSort" könnte helfen. Spricht was gegen
Solution06<T> extends AbsSort
oder sogar
Solution06<T extends Comparable<? super T>> extends AbsSort
(und das T entsprechend bei den Listen verwenden) ?
 

faulix

Mitglied
Hallo,

ja aber ist nicht das grundsätzliche Problem, dass T in einem Fall von Comparable erbt und im anderen Fall nicht, diese Unterscheidung macht mir zu schaffen.

Und wenn ich das T nennen, überlagert es sich dann nicht mit den Variablen bei den Set- und Get-Methoden? Eclipse zeit hier und eine Hiding-Warning an.

Grüße faulix
 

Der Müde Joe

Top Contributor
In dieser Aufgabe nützen Generics eigentlich nichts (Hab sie vor ?2 Tagen schon mal hier gesehen).
Schlussendlich gibts 2 Varianten. Eine mit Comparable und eine mit dem Comparator.

Das einzige was du von der AbsSort weisst, ist das es entweder eine Liste von Comparables ist oder sonst eine Liste von irgendetwas mit dem passenden Comparator.

siehe JavaDoc der Aufgabe..ca

Code:
<T extends Comparable<T> setData(List<T> data)
oder
Code:
<T> setData(List<T> data, Comparator<T> com

Wenn du nun in der gleichen Methode das max holen willst, muss das 2-geteilt werden.
ca
Java:
 if (comparator != null) {
//testen mit comparator
} else {
//cast nach Comparable und testen
}
 

faulix

Mitglied
Hallo,

vielen Dank für diese Antwort, das hilft schon einmal etwas weiter. Nun Frage ich mich jedoch wie ich das in der Klasse speichern kann, sodass das Comparable nicht verloren geht.

Prinzipiell besteht mein Problem weiterhin: Wie erreiche ich das Generic bei den Klassenvariablen, denn dort habe ich den Typ ja noch nicht übergeben bekommen?

Vielen Dank für die Hilfe.

Grüße faulix

EDIT

Ich habe nun diese Version (unten).

In Zeile 75, 79, 88, 92, 94 gibt es nun Typprobleme (Type Mismatch), wieso und wie kann ich diese beheben, das verstehe ich nicht so ganz.

Java:
package solutions;

import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import de.tu_darmstadt.es.sopra.exercises.AbsSort;

public class Solution06<T extends Comparable<T>> extends AbsSort {

	private LinkedList<T> classList;
	private Comparator<T> classComparator;
	
	@Override
	public <T> List<T> getData() {
		if (classList != null) {
			return (List<T>) this.classList;
		}
		return null;
	}

	@Override
	public Object getMax() {
		if (this.classList != null) {
			Iterator<T> items = this.classList.iterator();
			if (items.hasNext()) {
				T actualMax = items.next();
				while (items.hasNext()) {
					T item = items.next();
					if (this.classComparator != null) {
						if (this.classComparator.compare(actualMax, item) == -1) {
							actualMax = item;
						}
					} else {
						if (item.compareTo(actualMax) == -1) {
							actualMax = item;
						}
					}
				}
				return actualMax;
			}
		}
		return null;
	}

	@Override
	public Object getMin() {
		if (this.classList != null) {
			Iterator<T> items = this.classList.iterator();
			if (items.hasNext()) {
				T actualMin = items.next();
				while (items.hasNext()) {
					T item = items.next();
					if (this.classComparator != null) {
						if (this.classComparator.compare(actualMin, item) == 1) {
							actualMin = item;
						}
					} else {
						if (item.compareTo(actualMin) == 1) {
							actualMin = item;
						}
					}
				}
				return actualMin;
			}
		}
		return null;
	}

	@Override
	public <T extends Comparable<T>> void setData(Collection<T> arg0) {
		if (arg0 != null) {
			this.classList = new LinkedList<T>();
			Iterator<T> items = arg0.iterator();
			while (items.hasNext()) {
				T item = items.next();
				this.classList.add(item);
			}
		}

	}

	@Override
	public <T> void setData(Collection<T> arg0, Comparator<T> arg1) {
		if (arg0 != null && arg1 != null) {
			this.classList = new LinkedList<K>();
			Iterator<T> items = arg0.iterator();
			while (items.hasNext()) {
				T item = items.next();
				this.classList.add((K) item);
			}
			this.classComparator = (Comparator<K>) arg1;
		}
	}

	@Override
	public void sort() {
		LinkedList<T> newList = new LinkedList<T>();
		while (this.classList != null && !this.classList.isEmpty())  {
			T actualMin = (T) this.getMin();
			newList.add(actualMin);
			this.classList.remove(actualMin);
		}
		this.classList.addAll(newList);
	}

	@Override
	public String[] getAuthors() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getTeam() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String getVersion() {
		// TODO Auto-generated method stub
		return null;
	}

}
 
Zuletzt bearbeitet:

Der Müde Joe

Top Contributor
>sodass das Comparable nicht verloren geht.

Gar nicht.

Du weisst nur das es ein ? ist. Was du aber weisst:

- wenn der Comparator nicht null ist, hat es passende Objekte in der List
sonst
- wenn der Comparator null ist, sind Objekte, welche Comparable sind.

EDIT:
oder mit Code...hab mal das Abs Zeugs runtergezogen:
Java:
import java.util.Comparator;
import java.util.List;

public class Test { // extends AbsSort {

	private List<?> data;
	private Comparator<?> com;

	public <T> List<T> getData() {
		return (List<T>) data;
	}

	public Object getMax() {
		List<Object> list = getData();
		if (this.com != null) {
			// mit comparator Object vergleichen
		} else {
			// in der Liste sind comparables
		}
		return null;//max
	}

	public Object getMin() {
		List<Object> list = getData();
		if (this.com != null) {
			// mit comparator Object vergleichen
		} else {
			// in der Liste sind comparables
		}
		return null;//min
	}

	public <T extends Comparable<T>> void setData(List<T> data) {
		this.data = data;
		this.com = null;
	}

	public <T> void setData(List<T> data, Comparator<T> comp) {
		this.data = data;
		this.com = comp;
	}
}
 
Zuletzt bearbeitet:

faulix

Mitglied
>sodass das Comparable nicht verloren geht.

Gar nicht.

Du weisst nur das es ein ? ist. Was du aber weisst:

- wenn der Comparator nicht null ist, hat es passende Objekte in der List
sonst
- wenn der Comparator null ist, sind Objekte, welche Comparable sind.

Ich habe das mit dem Comparator denke ich nun gut ausgenutzt (siehe letzten Posting) und das funktioniert wahrscheinlich auch soweit.

Mein Problem ist nun in Zeile 75, 79, 88, 92, 94, dort gibt es nun Typprobleme (Type Mismatch). Das Problem ist wohl dass sich der Generictyp der Methode mit dem der Klasse überlagert, versteh ich das richtig? Wie kann man das Problem beheben?
 

Der Müde Joe

Top Contributor
Naja...K ist halt kein T..
K ist gar nix.

Es müsste ein T sein..aber dann passt eben die setData Methode nicht mehr.
Im Comparator Fall muss eben alles passen. Darum darf die Klasse auch nicht <T extends Comparable<T> sein.
Und die Listen auch nicht T (welche eigentlich in der super klasse schon da sind)
 

Marco13

Top Contributor
Hey, die TUD, ist mir ja gar nicht aufgefallen :)

Zugegeben, es ist wohl nicht im Sinne des Aufgabenstellers, dort
Solution06<T extends Comparable<T>>
zu verwenden, weil dadurch der Typ eingeschränkt wird. Für den allgemeinen Fall sollte man wohl den Comparator verwenden.

Jedenfalls wird mit den <T>s die vor den Methoden stehen natürlich das Klassen-<T> überdeckt. Es wäre wohl gut, (die Abstrakte Basisklasse und) die genaue Aufgabenstellung zu haben - speziell also, welche Methoden vorgegeben sind und nicht geändert werden dürfen, und ... wo kam in der ersten Variante das 'K' her? Und nicht zuletzt: Ist irgendwo explizit gesagt worden, dass der Code ohne unchecked- o.ä- Warnings compilieren muss?
 

Der Müde Joe

Top Contributor
>dass der Code ohne unchecked- o.ä- Warnings compilieren muss?

Das ist gar nicht möglich. Jemand hat mal vor 2 Tagen die JavaDoc der AbsSort gepostet. Sehr hässlich das ganze. Einmal cast nach Comparable und einmal cast nach Comparator. Jeweils ohne generics...
 

faulix

Mitglied
Hallo,

also DAS hat mir wirklich weiter geholfen. Ich habs halt einfach nicht gerafft, dass die Variablen schon in der Superklasse sind und sich somit das Problem der Erzeugung erst gar nicht ergibt.

Ich habe das nun dahingehend geändert, dass ich die Variablen der Superklasse nutze, beispielsweise so:
Java:
	public <T> void setData(Collection<T> arg0, Comparator<T> arg1) {
		if (arg0 != null && arg1 != null) {
			super.data = new LinkedList<T>();
			Iterator<T> items = arg0.iterator();
			while (items.hasNext()) {
				T item = items.next();
				super.data.add(item);
			}
			super.com = arg1;
		}
	}

Trotzdem habe ich folgendes Problem in Zeile 7: "The method add(capture#3-of ?) in the type List<capture#3-of ?> is not applicable for the arguments (T)"
Wenn ich ehrlich bin verstehe ich auch den Fehler nicht und weiß nicht so genau wo das Problem ist.

Hoffe ihr könnt mir auch dabei so super weiter helfen.

Grüße faulix
 

Der Müde Joe

Top Contributor
Code:
super.data = new ArrayList(arg0);

sollte reichen, wenn ich mich noch richtig erinnere..

EDIT:
Muss man die Methode überhaupt überschreiben?? war die abstract?
 

faulix

Mitglied
Zu einfach, so weit habe ich nicht gedacht.

Ja die sind leider alle abstract und somit muss ich sie definieren.

Nun habe ich noch bei den Min und Max-Methoden das Problem, dass ich einen Iterator erzeugen muss, ich jedoch nicht weiß mit welchem Typ, wie löse ich das am geschicktesten?
 

faulix

Mitglied
Code:
super.com.compare(actualMax, item)
Fehler: The method compare(capture#9-of ?, capture#9-of ?) in the type Comparator<capture#9-of ?> is not applicable for the arguments (Object, Object)

Was hat der nur immer für Probleme?

Ansonsten habe ich den Iterator nun mit get() umgangen indem ich get in eine for-Schleife mit den Indizies gepackt habe und diese mit Hilfe von size() durchlaufen lasse.
 

Der Müde Joe

Top Contributor
Java:
Comparator comparator =  (Comparator)super.comp;
comparator.compare(max, data)

Generics am besten gleich weglassen...dito dann zu Comparable casten..
 

faulix

Mitglied
Hab
Code:
Object item = super.data.get(index);
für den Comparable, aber funktioniert nicht und wüsste nicht wie ich da anders casten soll.
 

Der Müde Joe

Top Contributor
Java:
Object max = list.get(0);
for (Object object : getData()) {
	Comparable comparable = (Comparable)object;
	if (comparable.compareTo(max) > 0) {
		max = object;
	}
}
return max;

testen ob die liste nicht empty ist wäre gut
 
Zuletzt bearbeitet:

faulix

Mitglied
Code:
if (comp.compare(actualMin, item) == 1) {
Diese Zeilen wirft das hier aus: Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

Was versucht er da zu Integer zu casten?
 

Marco13

Top Contributor
Ohne mehr präzisere Infos ist her VIEL Spekulation dabei. Ob das mit dem Fehler zusammenhängt, weiß ich nicht, aber es könnte sein: Wenn setData (ohne Comparator) aufgegrufen wird, muss eventuell ein schon gesetzter Comparator auf 'null' gesetzt werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Generische Klasse Java Basics - Anfänger-Themen 6
M Methoden Generische Klasse - ändern einzelner Attributwerte Java Basics - Anfänger-Themen 2
J Probleme mit static generische Klasse Java Basics - Anfänger-Themen 6
B Generische Klasse Java Basics - Anfänger-Themen 7
K Generische Klasse mit innerer Klasse | Problem mit Array Java Basics - Anfänger-Themen 6
B Was passiert, wenn eine konkrete Klasse von generische Klasse erbt? Java Basics - Anfänger-Themen 14
S Parameterübergabe: Generische Klasse Java Basics - Anfänger-Themen 4
P Generische Klasse Java Basics - Anfänger-Themen 8
I Generische Funktion Java Basics - Anfänger-Themen 3
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
H Generische Konstruktor Java Basics - Anfänger-Themen 12
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14
H linkedlist generische klassen Java Basics - Anfänger-Themen 169
M Datentypen Generische Datentypen - Syntax Java Basics - Anfänger-Themen 25
O Generische Typen Java Basics - Anfänger-Themen 9
M Generische Klassen "FlaschenRegal" Java Basics - Anfänger-Themen 13
Queiser Datentypen 2 generische Datentypen für eine Schnittstelle Java Basics - Anfänger-Themen 1
M Generische Liste aus Comparable-Objekten Java Basics - Anfänger-Themen 6
J Sortierte generische Liste Java Basics - Anfänger-Themen 1
D statische generische Methoden Java Basics - Anfänger-Themen 3
S Wie muss ich die Generische Methode schreiben? Java Basics - Anfänger-Themen 6
S generische methode mit verschiedenen datentypen Java Basics - Anfänger-Themen 3
N Generische Schnittstellen Java Basics - Anfänger-Themen 2
B generische LinkedList nach Häufigkeit der Elemente füllen Java Basics - Anfänger-Themen 6
D Generische Typen Java Basics - Anfänger-Themen 20
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
L Generische Liste Java Basics - Anfänger-Themen 4
B Generische Queue programmieren Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
A Probleme mit MergeSort Generische Liste Java Basics - Anfänger-Themen 0
A Generische Methode Java Basics - Anfänger-Themen 4
H Collections List in List<SpecificType> als stat. generische Methode zurückgeben Java Basics - Anfänger-Themen 4
M Generische Liste Java Basics - Anfänger-Themen 4
B Generische Methode Java Basics - Anfänger-Themen 2
B Generische Methoden Java Basics - Anfänger-Themen 8
L Generische Warteschlange Java Basics - Anfänger-Themen 8
A Generische Datentypen Java Basics - Anfänger-Themen 8
bluerob generische ArrayList -> erbende Objekte auslesen Java Basics - Anfänger-Themen 24
L Generische Containerklasse Java Basics - Anfänger-Themen 9
V Methoden Umwandlung in generische Methode Java Basics - Anfänger-Themen 8
A Generische Collections und Vererbung Java Basics - Anfänger-Themen 2
S Generische HashMap Java Basics - Anfänger-Themen 2
M Klassen Generische Klassen, Personen und Gruppen Java Basics - Anfänger-Themen 6
L Generische ArrayList, CastProblem Java Basics - Anfänger-Themen 2
W generische Module Java Basics - Anfänger-Themen 2
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
C unterschied generische typen und supertypen als methodenparameter Java Basics - Anfänger-Themen 3
D Datentypen Generische Collections und Warnings Java Basics - Anfänger-Themen 8
F Generische Methoden Problem Java Basics - Anfänger-Themen 5
E Generische Arrays durch Typecast mit Object-Array Java Basics - Anfänger-Themen 11
B Generische Vererbung was ist der Unterschied? Java Basics - Anfänger-Themen 4
W Generische Klassen Java Basics - Anfänger-Themen 3
W Generische Klassen und Casting Java Basics - Anfänger-Themen 6
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
J array über generische arraylist Java Basics - Anfänger-Themen 7
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
N 2 dimensionale generische Arrays Java Basics - Anfänger-Themen 9
H Statische generische Methode Java Basics - Anfänger-Themen 2
G Frage zum Ungang mit Generische Datentypen Java Basics - Anfänger-Themen 4
0x7F800000 generische arrays mal wieder )-; Java Basics - Anfänger-Themen 6
D generische methode <T> void . Java Basics - Anfänger-Themen 9
J Generische Methoden Java Basics - Anfänger-Themen 6
G Doppelt verkettete, generische Liste Java Basics - Anfänger-Themen 11
S generische Felder Java Basics - Anfänger-Themen 2
C Generische Klassen, das erste Mal. Java Basics - Anfänger-Themen 8
F Generische Methode - was bringt der Wildcard Operator? Java Basics - Anfänger-Themen 7
F Generische Liste von generischen Objekten. Java Basics - Anfänger-Themen 3
H generische Methoden Java Basics - Anfänger-Themen 5
N generische HashMap und Iterator Java Basics - Anfänger-Themen 2
H generische Bausteine, heterogene Datenstrukturen Java Basics - Anfänger-Themen 2
J generische klassen neue Instanz Java Basics - Anfänger-Themen 5
H Generische Klassen. Java Basics - Anfänger-Themen 16
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
B Klasse statisch erstellen da n-mal geladen Java Basics - Anfänger-Themen 3
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
XWing Random Punkte erstellen mit der Random klasse Java Basics - Anfänger-Themen 15
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
frager2345 Optional Klasse Java Java Basics - Anfänger-Themen 2
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
H Klassen Typ und Intitialisierungs-Klasse, wer bestimmt was? Java Basics - Anfänger-Themen 1
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
frager2345 Java Klasse Buch verwalten Java Basics - Anfänger-Themen 0
frager2345 Java eigen Klasse zum verwalten von Büchern Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben