Theoretische Übung 2

andiderp
Erstie
Erstie
Beiträge: 20
Registriert: 14. Apr 2012 13:37

Theoretische Übung 2

Beitrag von andiderp »

Hi,

was ist genau mit abstrakter Sequenz gemeint? Ist damit die ArrayList wie man sie von aussen sieht oder wie sie intern aufgebaut ist?

Prof. Karsten Weihe
Dozentin/Dozent
Beiträge: 1824
Registriert: 21. Feb 2005 16:33

Re: Theoretische Übung 2

Beitrag von Prof. Karsten Weihe »

andiderp hat geschrieben: was ist genau mit abstrakter Sequenz gemeint? Ist damit die ArrayList wie man sie von aussen sieht oder wie sie intern aufgebaut ist?
Ersteres. Erzähle ich heute in der Vorlesung genauer.

KW

ur52tuwe
Neuling
Neuling
Beiträge: 7
Registriert: 14. Okt 2010 14:41

Re: Theoretische Übung 2

Beitrag von ur52tuwe »

Ich hätte da noch eine Frage zur Aufgabe:

Und zwar muss man ja die Methode compress() implementieren und diese soll aus nur einer Schleife bestehen.
Angenommen die ArrayList besteht momentan aus 2 Arrays (null steht herbei für leer/ungültig):
Array1: [1][2][null]; n=2
Array2: [3][4][null]; n=2

Dann sollte das Ergebnis ja folgendermaßen aussehen (wie es bei einem Beispiel auf dem Blatt ja schon gezeigt worden ist):
Array1: [1][2][3]; n=3
Array2: [4][null][null]; n=1

Soweit würde ich das auch in einer Schleife ohne Probleme unterbrigen können, wäre da nicht das Problem, dass ich die Zahl "3" aus dem Array2 löschen muss bzw. den restlichen Inhalt dieses Arrays einfach um eine Stelle verschieben müsste und dabei die "3" überschreibe. Aus der Vorlesung habe ich es so entnommen, dass intern die Elemente eines Arrays immer die ersten n Felder besetzen und die letzen N-n Felder leer/ungültig sind. Es gibt also keine leere/ungültige Lücke zwischen 2 Elementen. Anders würde man sich das Leben ja auch unnötig schwer machen und die Variable n wäre ja sogut wie überflüssig, da man mit ihr nur erkennen könnte ob noch Platz im Array ist oder eben nicht.

Also zu meiner eigentlichen Frage:
Ist es in dieser Aufgabe erlaubt dafür eine Hilfsmethode in der KeyItem-Klasse anzulegen (z.B. deleteFirstItem)?

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Theoretische Übung 2

Beitrag von JannikV »

Hallo, kleine Frage zum vorgegebenen Code.

Da ich das ganze auch immer mal gern eintippe um es als tatsächliches Programm testen zu können, ist mir aufgefallen dass KeyItem nicht kompiliert.
Die Zeile
this.array = new T[0];
produziert den Fehler "Generische Feldgruppe T kann nicht erstellt werden".
Kann man da was machen? Mir fällt jetzt spontan nicht ein warum das passiert und wie man es umgehen kann.

VG

Matt
Erstie
Erstie
Beiträge: 18
Registriert: 20. Dez 2011 19:22

Re: Theoretische Übung 2

Beitrag von Matt »

Java hat keine reified Generics. Deswegen ist so etwas nicht möglich. Verwende einfach Object statt T (auch in der Definition des Members) und füge casts ein wenn du Elemente aus dem Array holst.

IMO ist auch das 0 als Array-Größe falsch und stattdessen müsste hier N verwendet werden. Aber vielleicht habe ich beim überfliegen der Aufgabenstellung auch irgendwas missverstanden.

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Theoretische Übung 2

Beitrag von JannikV »

Ok, danke.

Joa, N kennt diese Klasse ja nicht. Müsste man dem Konstruktor mitgeben.

Sieht so aus als müsste man diverse Dinge umschreiben wenn man das tatsächlich implementieren will.

VG

Benutzeravatar
Blub
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 244
Registriert: 24. Dez 2007 14:06

Re: Theoretische Übung 2

Beitrag von Blub »

JannikV hat geschrieben:Hallo, kleine Frage zum vorgegebenen Code.

Da ich das ganze auch immer mal gern eintippe um es als tatsächliches Programm testen zu können, ist mir aufgefallen dass KeyItem nicht kompiliert.
Die Zeile
this.array = new T[0];
produziert den Fehler "Generische Feldgruppe T kann nicht erstellt werden".
Kann man da was machen? Mir fällt jetzt spontan nicht ein warum das passiert und wie man es umgehen kann.

VG
Ups, mein Fehler. Du hast in der Tat recht. Die Änderung enstand kurzfristig, ich habe daher nicht mehr drauf geachtet :/

Eine mögliche Änderung wäre beispielsweise die Signatur zu
public KeyItem(T[] array, int n)
{
this.array = array;
this.n = n;
}
zu ändern. Und ja, n und nicht N. Hiermit werden auch Tests erleichtert. Man könnte nun in KeyItem noch testen ob n < N etc gilt, aber da dies nur eine theoretische Übung ist, lassen wir dies der einfachheithalber weg.


Christian
Tutor GDI II SS12
Tutor Trusted Systems WS11/12, Tutor GDI II SS11
Tutor Trusted Systems WS10/11, GDI I WS10/11
Tutor GDI II SS10, Tutor Trusted Systems WS09/10

braunse
Erstie
Erstie
Beiträge: 11
Registriert: 19. Apr 2012 13:46

Re: Theoretische Übung 2

Beitrag von braunse »

Hab noch ein par Verständnisprobleme mit der Aufgabe a! Ist es richtig das list die verschiedenen Arrays beinhaltet? Und ich hab noch nicht ganz verstanden wie ich z.b die länge eines Arrays abprüfe um zu wissen ob ich noch ein Element einfügen kann oder nicht!

Benutzeravatar
Blub
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 244
Registriert: 24. Dez 2007 14:06

Re: Theoretische Übung 2

Beitrag von Blub »

hey Mr. Brown :p

List ist eine LinkedList aus Übung 1. Die ListItems von List enthalten zum einen das KeyItem, und zum anderen Pointer auf das nächste Listenelement.
In der Klasse ArrayList befindet sich das Attribut N, N ist die Länge jedes Arrays. Das n der Klasse KeyItem gibt dir an, wieviele Elemente du tatsächlich aus diesem Array verwendet hast.

Beispiel:
([1,2,3,void,void],3) - in diesem Beispiel wäre N = 5, da das Array 5 Elemente lang ist. Und n = 3, da nur 3 diese 5 Elemente genutzt wurden.


Einfügen tust du eigentlich gar nichts in diese Arrays, Du bekommst eine List und sollst diese ja nur komprimieren, sprich du fügst keine Elemente ein, sondern tauschst die Elemente.


Christian
Tutor GDI II SS12
Tutor Trusted Systems WS11/12, Tutor GDI II SS11
Tutor Trusted Systems WS10/11, GDI I WS10/11
Tutor GDI II SS10, Tutor Trusted Systems WS09/10

braunse
Erstie
Erstie
Beiträge: 11
Registriert: 19. Apr 2012 13:46

Re: Theoretische Übung 2

Beitrag von braunse »

Da hat er mich erkannt!
Ok danke schonmal für die Erklärung!
Aber noch ist mir nicht ganz klar wie ich dann n<N abprüfe um zu wissen das nicht alle Plätze des Arrays belegt sind!

ur52tuwe
Neuling
Neuling
Beiträge: 7
Registriert: 14. Okt 2010 14:41

Re: Theoretische Übung 2

Beitrag von ur52tuwe »

Das sollte nun aber nicht mehr so schwer sein. Ich denke du stehst momentan einfach nur auf dem Schlauch.
Du kannst doch ohne Probleme auf n und N zugreifen.
Das N befindet sich ja in der ArrayList selbst und das kleine n befindet sich in jedem Elements des Listen-Objekts "list".

Beispiel:

if (list.get(i).n < N) {
// do something serious
}

damit würde die If-Bedingung erfüllt sein, falls das i-te Array weniger als N Einträge hält.

braunse
Erstie
Erstie
Beiträge: 11
Registriert: 19. Apr 2012 13:46

Re: Theoretische Übung 2

Beitrag von braunse »

jep!
Danke soweit schon mal

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Theoretische Übung 2

Beitrag von JannikV »

ur52tuwe hat geschrieben: if (list.get(i).n < N) {
// do something serious
}
Wenn das nun in ähnlicher Form Teil der einen Schleife ist die wir benutzen dürfen frage ich mich ob das überhaupt erlaubt ist. Denn die benutzte get() Methode verwendet intern sicherlich auch eine Schleife (um über die Liste zu iterieren bis wir am passenden KeyItem sind).

Würde mich über genauere Angaben zum Erlaubten freuen.

VG

Benutzeravatar
Blub
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 244
Registriert: 24. Dez 2007 14:06

Re: Theoretische Übung 2

Beitrag von Blub »

JannikV hat geschrieben:
ur52tuwe hat geschrieben: if (list.get(i).n < N) {
// do something serious
}
Wenn das nun in ähnlicher Form Teil der einen Schleife ist die wir benutzen dürfen frage ich mich ob das überhaupt erlaubt ist. Denn die benutzte get() Methode verwendet intern sicherlich auch eine Schleife (um über die Liste zu iterieren bis wir am passenden KeyItem sind).

Würde mich über genauere Angaben zum Erlaubten freuen.

VG
Ich denke das war nur ein Beispiel von ihm. Du hast schon recht das list.get(i) natürlich nicht verwendet werden dürfte, wegen dem von dir genannten Grund.
Tutor GDI II SS12
Tutor Trusted Systems WS11/12, Tutor GDI II SS11
Tutor Trusted Systems WS10/11, GDI I WS10/11
Tutor GDI II SS10, Tutor Trusted Systems WS09/10

Benutzeravatar
JannikV
Nerd
Nerd
Beiträge: 609
Registriert: 24. Apr 2011 12:42

Re: Theoretische Übung 2

Beitrag von JannikV »

Hallo, mir ist noch nicht ganz klar wie die Methode compress funktionieren soll.

Dort steht man soll über die Elemente der abstrakten Sequenz iterieren. Das verstehe ich so, dass es über die von außen abfragbaren Elemente gehen soll. Also wenn im ersten Array 2 von 4 Elementen vorhanden sind (nennen wir sie a und b) und im zweiten 1 von 4 (nennen wir es c) soll die Iteration von a über b nach c gehen ohne das die Iterationsvariable die leeren Plätze im ersten Array annimmt.
Aber wie soll das gehen? Von außen würde man eine get() Methode der Klasse ArrayList aufrufen, doch diese würde letztendlich auch in einer Schleife resultieren da alles in einer linearen Sequenz abgelegt ist.

In der Aufgabenstellung steht ja dass man nicht über die ListItems iterieren soll, auch wenn mir das erstmal intuitiver erscheint.
Doch auch da gibt es Probleme. compress() soll eine Methode der Klasse ArrayList sein. Diese hat nur Zugriff auf eine List als ganzes. Es ist also gar nicht möglich sich Hilfsvariablen anzulegen die auf einzelne ListItems, KeyItems oder Arrays zeigen. Um das zu machen müssten List, ListItem und KeyItem entweder nur public Variablen haben oder eine Reihe seltsamer Methoden anbieten die Zugriff auf alles gewähren. Beides ist tatsächlich absolut unüblich.

Was darf ich tun, auf was kann ich nun zugreifen und was ist laut Aufgabenstellung erlaubt oder nicht erlaubt.

Ich denke ich benötige mehr Information für diese Aufgabe.

VG

Antworten

Zurück zu „Archiv“