Allgemeines Verständnis

Moderator: AI 2

Benutzeravatar
SophiaLi1
Moderator
Moderator
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Allgemeines Verständnis

Beitrag von SophiaLi1 »

Ach so, danke!

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

OK, noch ne Frage zur LinkedList: Ein Objekt kann mehrere Referenzen haben. Bsp:

Code: Alles auswählen

Y test1: new Y();
Y test2;
test2 = test1;
Nun zeigen test2 als auch test1 auf das selbe Objekt. Meine Frage ist nun, ob ich mir mit diesem Vorgehen neue Einstiegspunkte in ner LinkedList schaffen kann.
Sagen wir mal alle 50 Elemente setz ich dann so einen externen Einstieg. In meiner Liste weiß ich dann, dass mein gesuchtes Element auf jeden Fall erst nach Index 150 kommt. Dann könnte ich ja den entsprechenden Einstieg nutzen, anstatt die Liste von vorne durch zu laufen?!?
Bild
...Never go full retard...

Osterlaus
BSc Spammer
BSc Spammer
Beiträge: 1263
Registriert: 23. Aug 2007 12:46
Wohnort: DA

Re: Allgemeines Verständnis

Beitrag von Osterlaus »

aDramaQueen hat geschrieben:OK, noch ne Frage zur LinkedList: Ein Objekt kann mehrere Referenzen haben. Bsp:

Code: Alles auswählen

Y test1: new Y();
Y test2;
test2 = test1;
Nun zeigen test2 als auch test1 auf das selbe Objekt. Meine Frage ist nun, ob ich mir mit diesem Vorgehen neue Einstiegspunkte in ner LinkedList schaffen kann.
Sagen wir mal alle 50 Elemente setz ich dann so einen externen Einstieg. In meiner Liste weiß ich dann, dass mein gesuchtes Element auf jeden Fall erst nach Index 150 kommt. Dann könnte ich ja den entsprechenden Einstieg nutzen, anstatt die Liste von vorne durch zu laufen?!?
Allein so nicht. Wenn du test1 veränderst, veränderst du auch test2. Was du vermutlich möchtest (das hat dann aber nicht mehr viel mit einer LinkedList zu tun) ist verschiedene Elemente aus der Liste zu cachen. Eine gescheite Umsetzung fällt mir gerade nicht ein, aber wenn du einen schnellen Zugriff auf beliebige Elemente wünscht, solltest du lieber eine andere Datenstruktur verwenden...

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Osterlaus hat geschrieben: Allein so nicht. Wenn du test1 veränderst, veränderst du auch test2. Was du vermutlich möchtest
Nee, eigentlich möchte ich nur einen neuen Einstiegspunkt in die LinkedList schaffen.

Neu Frage bzgl. Konvertierungen. Ich weiß man kann Wertetypen "upcaste", also z.Bsp. ein double zu nem int casten. Dabei gehen unter Umständen Informationen verloren.
Das "upcasten" funktioniert ebenfalls bei Referenztypen. Wenn man das in einer Vererbungshierarchie macht schätze ich mal gehen dann dementsprechen alle Methoden & Datenfelder der Subklasse verloren.
Wie schaut das nun aber aus wenn ich 2 völlig unabhängige Klassen habe und eine in die andere konvertieren will. Werden dann nur jene Datenfelder und Methoden übernommen die die selben Namen, Signaturen und Rückgabetypen haben oder ist dies grundsätzlich garnicht möglich?
Bild
...Never go full retard...

Benutzeravatar
SophiaLi1
Moderator
Moderator
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Allgemeines Verständnis

Beitrag von SophiaLi1 »

Achtung, einen double zu einem int zu casten ist kein Upcast!

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Ok, ich hab nun ein sehr spezielles Problem:

Ich hab eine Basisklasse und mehrere Subklassen von dieser. Ich möchte nun abhängig davon was ich der copy-Methode für eine Subklasse gebe, eben eine Kopie von der Subklasse haben.
Bsp: Mutterklasse A mit Kind1, Kind2 und Kind3.
Nun eben das Kopieren: A.copy(Kind1 instanz) soll dann eben eine neue Instanz von Kind1 liefern.
Ich weiß es gibt die newInstance()-Methode. Die funktioniert aber nur bei einem leeren Konstruktor, was hier nicht der Fall ist. Somit gibts eben noch den Constructor, welcher eben genau das macht was ich will, er instanziert ein Objekt beliebigen Types mit seinen Parametern. Nun muss man diesem Constructor natürlich noch sagen, was für Argumente die zu instanzierende Klasse überhaupt hat. Einmal muss man ihm die Typen liefern und einmal die konkreten Werte. Die Konkreten Werte sind nicht das Problem. Ich hab Probleme bei den Typen!

Code: Alles auswählen

import java.lang.reflect.Constructor;

public Class<? extends Basisklasse> copy(Basisklasse instanz){

	Class<? extends Basisklasse> clazz = instanz.getClass();
	Object[] argsBasisklasse = getArguments(instanz); // Diese Methode ist schon implementiert und läuft

	Class[] argTypes = ????

	Constructor cstr = clazz.getConstructor(argTypes);
	Basisklasse kopie = cstr.newInstance(argsBasisklasse);
	return kopie;
}
Wie ich das verstanden habe, muss dieses Typen-Array aus class-Objekten bestehen, also so etwas wie String.class oder int.class
Nun ist meine Frage, ob es eine Methode gibt, die mir dieses Array schon produziert, oder muss ich das per Hand anlegen?
Bild
...Never go full retard...

Benutzeravatar
AlexPi11
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 154
Registriert: 18. Apr 2009 15:32

Re: Allgemeines Verständnis

Beitrag von AlexPi11 »

Erstmal vorweg: Der Einfachheit halber lasse ich die Generics weg.

Zum einen fällt auf, dass die Signatur public Class copy(Basisklasse instanz) nicht stimmt, da du ja eine konkrete Kopie zurückgeben willst. Also müsste es public Basisklasse copy(Basisklasse instanz) heissen. Möchtest du wirklich nur die Klasse zurückgeben, wäre die Methode mit return instanz.getClass() abgefrühstückt.

Zum anderen, dass falls du in der Basisklasse schon weisst, wie du die Objekte kopieren willst, du wohl keine Information zur Unterklasse brauchst. Sprich man hätte sowas wie:

Code: Alles auswählen

public Basisklasse copy(){
 Basisklasse kopie = new Basisklasse();
 kopie.feldA = this.feldA; // bzw. bei deep copy sowas wie this.fieldA.copy() o.ä.
 ...
 return kopie;
}
Falls es nun doch spezielle Sachen in den Unterklassen gibt, die beim Kopieren beachtet werden müssen, macht es vielleicht mehr Sinn diese Kopiermethode in eben diesen zu implementieren.

Ansonsten zur eigentlichen Frage. Via Reflection wie du sie ja schon benutzt z.B. bei Constructor cstr = clazz.getConstructor(argTypes); lässt sich so ziemlich alles herausfinden über eine Klasse. Zuerst braucht man den Konstruktor. Hier gibt es via getContructors() eine Auswahl aller Kontruktoren. Die Methode clazz.getConstructor(argTypes); wird dir nicht helfen, da du hier auf ein Huhn oder Ei Problem stößt. Du brauchst ja erstmal einen Konstruktor um seine definierten Parameter abzufragen. Angenommen es gibt immer nur einen Konstruktor könnte man getContructors()[0] benutzen, ansonsten braucht es eben ein Aussuchverfahren. Mit einem Constructor lassen sich die Parameter dann via getParameterTypes() bestimmen.

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

OK, habs nun auf was compilierbares runtergedrückt: Jedoch tut die Methode nicht was sie soll. Ich habe eine Änderung bei den Parametern vorgenommen. (Evtl. ist hier auch deshalb der Methodenname copy() etwas unglücklich gewählt.) Diese Änderung wird jedoch nicht übernommen, sondern stattdessen der Ursprungsinhalt angezeigt. Ich lass mir extra nochmal das Array von Object[] argsBasisklasse über System.out.println ausgeben und da sind die veränderten Parameter drinnen. Er scheint sie in der Letzten try-Zeile aber anscheinend nicht zu benutzen???

Code: Alles auswählen

	Class<? extends Basisklasse> clazz = instanz.getClass();
	Class[] argTypes = clazz.getConstructors()[0].getParameterTypes();    // hier isses wirklich nur 1 Konstruktor
	Object[] argsBasisklasse = Basisklasse.getArguments(instanz);     // statische Methode in der Basisklasse, gibt die Paramter so wie ich sie will
	Basisklasse kopie = null;
	try {
		Constructor cstr = clazz.getConstructor(argTypes);
		kopie = (Basisklasse) cstr.newInstance(argsEntity);
	}
	catch (Exception exc){
		System.out.println(exc);
	}
Bild
...Never go full retard...

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

OK, gelogen es funktioniert. Habs nur falsch ausgelesen. DANKE!!!
Bild
...Never go full retard...

Holly19
Erstie
Erstie
Beiträge: 21
Registriert: 18. Mai 2014 12:15

Re: Allgemeines Verständnis

Beitrag von Holly19 »

Hi,
ich würde gerne was zu B-Trees fragen, konkret zum Löschen eines Wertes: Ist es bei der Rotation egal, mit welchem Geschwisterknoten die Rotation stattfindet(vorausgesetzt natürlich, die Rotation ist mit beiden möglich!) ?
Zu diesem Thema hab ich auch noch eine Frage zum Ferienübungsblatt, Aufgabe 3: Beim Löschen der 500, muss ich ja, wenn ich er richtig verstanden habe, die Rotation anwenden, wenn ich zum Knoten mit der 500 heruntergehen will. Könnte ich nicht auch einfach den Knoten mit der 500 löschen? Dann wäre nach dem Löschen ja theoretisch keine B-Tree-Regel verletzt.

Vielen Dank und liebe Grüße!

OmasBraten
Neuling
Neuling
Beiträge: 2
Registriert: 22. Aug 2014 11:36

Re: Allgemeines Verständnis

Beitrag von OmasBraten »

Holly19 hat geschrieben:Hi,
ich würde gerne was zu B-Trees fragen, konkret zum Löschen eines Wertes: Ist es bei der Rotation egal, mit welchem Geschwisterknoten die Rotation stattfindet(vorausgesetzt natürlich, die Rotation ist mit beiden möglich!) ?
Zu diesem Thema hab ich auch noch eine Frage zum Ferienübungsblatt, Aufgabe 3: Beim Löschen der 500, muss ich ja, wenn ich er richtig verstanden habe, die Rotation anwenden, wenn ich zum Knoten mit der 500 heruntergehen will. Könnte ich nicht auch einfach den Knoten mit der 500 löschen? Dann wäre nach dem Löschen ja theoretisch keine B-Tree-Regel verletzt.

Vielen Dank und liebe Grüße!
Hey,
du kannst nicht einfach die 500 löschen, da sonst die Regel mit der Tiefe des Baumes verletzt ist. Daher musst du die Rotation anwenden.

Holly19
Erstie
Erstie
Beiträge: 21
Registriert: 18. Mai 2014 12:15

Re: Allgemeines Verständnis

Beitrag von Holly19 »

Also die Regel besagt ja, dass ich mindestens M-1 Schluessel in einem Knoten haben muss. Aber wenn ich den Knoten komplett loesche, dann ist der ja weg und die Regeln gelten fuer den Rest des B-Trees ?!

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: Allgemeines Verständnis

Beitrag von aDramaQueen »

Servus, ich hätt auch nochmal ne Frage.
Im Video: Hashtable werden 2 Behauptungen in den Raum geworfen die mich etwas stutzig machen:

1.) Es wird behauptet das Hashtables von Natur aus NICHT löschen können (Videozeit: 05:56). Die Java-API sagt da aber was anderes (http://docs.oracle.com/javase/7/docs/ap ... table.html)?!?

2.) Es wird behauptet, dass wenn man in nem Hashtable nur die Keys und KEINE Values speichert, man auf ein Set hinaus kommt (Videozeit: 07:14). Auch hier sagt die Java-API was anderes. Dort ist die Superklasse von Set nämlich Collection bzw. Iterable und die von Map eben Hashtable bzw. Dictionary (http://docs.oracle.com/javase/7/docs/ap ... rable.html & http://docs.oracle.com/javase/7/docs/ap ... onary.html)?!?
Dictionary und Iterable haben nun aber nach der API garnichts miteinander zu tun! Das Selbe gilt für Collection und Hashtable!!!

Was soll ich nun in der Klausur hinschreiben???
Bild
...Never go full retard...

Benutzeravatar
SophiaLi1
Moderator
Moderator
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Allgemeines Verständnis

Beitrag von SophiaLi1 »

Hey,
die in den Folien beschriebenen Klassen waren selbst geschriebene Klassen und nicht die Klassen aus der Java-Standardbib (daran zu sehen, dass die Klasse HashMap z.B. gar nicht die Methode insert besitzt).

Benutzeravatar
SophiaLi1
Moderator
Moderator
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: Allgemeines Verständnis

Beitrag von SophiaLi1 »

Und ohne jetzt Genaueres zu wissen, darf man wahrscheinlich wieder davon ausgehen, dass die Methoden der Klassen aus der Standardbibliothek angegeben werden, falls wir eine Klasse aus der Standardbibliothek nutzen sollen. Man muss die API nicht auswendig lernen. Das macht ja auch keinen guten Informatiker zwingend aus^^

Antworten

Zurück zu „AI 2“