Datentypen Klasse Vector aus der Standard-API anwenden

Eddie

Mitglied
Hallo Leute,

ich hab hier mal wieder ein kleines Problem. Es geht dabei um folgendes:
ich soll eine Klasse ListVector<T> erstellen. Und das unter Verwendung der Klasse Vector aus der Java-API.
Mein Problem dabei ist, dass ich im Moment nicht drauf komm, wie ich die Methoden aus dieser Klasse in meiner Klasse anwenden kann.
Hier der Link zur Bibliothek:
Vector (Java 2 Platform SE v1.4.2)

Das ganze sollte dann meiner Meinung nach folgendermaßen aussehen:

Java:
package aufg1;

import java.util.Vector;

public class ListVector<T> {
	
	//Fügt der Liste ein Elementan an der Stelle p hinzu
	public void add (int p, T x){
		
	}
}

Ich könnte natürlich die Methode add manuell implementieren. Aber das wäre ja nicht der Sinn der Übung.
Ich verstehe nur nicht ganz, warum ich die Methode add überhaupt brauch, wenn ich doch sowieso die aus der Bibliothek verwenden soll. Die Main Methode sieht übrigens folgendermaßen aus:

Java:
public class Drive {
	public static void main(String[] args){
        ListVector<String> l = new ListVector<String>();
        System.out.println(l.isEmpty() );
		l.add( l, "Kahn" );
		l.add( l, "Rudi" );
		System.out.println( "Index von Kahn " + l.indexOf( "Kahn" ) );
		l.add( 2, "Linke" );
		System.out.println( l.get(2) );
		System.out.println( l.remove(2) );
		System.out.println( l.remove(2) );
}

Für eure Mühe schon mal im Vorraus besten Dank!
 
führe das Hauptprogramm aus und es wird noch nicht richtig funktionieren,
das ist aller Grund der Welt für dich, die Aufgabe zu bearbeiten,

du sollst eben eine ListVector-Klasse bauen, die Vector benutzt, statt Vector selber,
über Sinn musst du nicht nachdenken, stelle dich der Herausforderung, dies umzusetzen
 
Danke, ich denke, das
du sollst eben eine ListVector-Klasse bauen, die Vector benutzt, statt Vector selber
hat mich schon mal ein Stück weiter gebracht.

Ich hab jetzt mal die add-Methode folgendermaßen erweitert:
Java:
public void add (int p, T x){
		Vector<T> v = new Vector();
		v.add(p, x);
}

Jetzt bekomm ich allerdings eine ArrayOutOfBoundException, da 1>0
Ich hab ja im Drive-Programm z.B. stehen:

Java:
l.add( l, "Kahn" );

Aber das "l" ist ja keine Integer-Variable, sondern das Objekt Liste.
Andererseits soll man in der Liste ja nur am Ende ein Element einfügen können.
Heißt das, ich muss erst prüfen, an welcher Stelle das neue Element eingefügt wird?
Wenn ja, warum muss ein int p als Parameter in der Methode angegeben werden?
Weiterhin wird ja der Methode add durch das Hauptprogramm gar kein integer übergeben, sondern nur das Objekt l.
 
das dürfte
> l.add( eins, "Kahn" );
lauten,
der Parameter ist schon wichtig damit man nicht nur am Ende, sondern auch an beliebiger Position einfügen kann,
direkt an Vector kannst du das anscheinend nicht weitergeben,
schon ein Grund für dich bisschen was intelligenteres zu programmieren oder zumindest die Indexe umzurechnen,
ich will nicht zuviel verraten, ist deine Aufgabe

baue es so, dass es bei 1 (eins!) keine Exception gibt und das Element an erster Position gespeichert wird, sollte überschaubar sein

> Andererseits soll man in der Liste ja nur am Ende ein Element einfügen können.

steht das in der Aufgabe? widerspricht dem Sinn der Zeilen 5-7 der main-Methode
 
das dürfte
> l.add( eins, "Kahn" );
lauten,

Stimmt, mein Fehler 🙂
Das ist auch ein Problem, wenn man den Code abtippen muss und ihn nicht in Form einer txt-Datei bekommt.

> Andererseits soll man in der Liste ja nur am Ende ein Element einfügen können.

steht das in der Aufgabe? widerspricht dem Sinn der Zeilen 5-7 der main-Methode

Oh nein, stimmt, du hast Recht. Ich hab da was verwechselt. Das war bei der Schlange (keine Ahung, ob das der richtige Begriff ist) so.

Ich probier das jetzt mal. Hast mir auf jeden Fall schon mal geholfen und die Richtung stimmt auch.
 
Java:
import java.util.Vector;

public class ListVector<T> {
	
	Vector<T> v = new Vector();
	
	//Fügt der Liste ein Elementan an der Stelle p hinzu
	public void add (int p, T x){
		int index;
		if (isEmpty() == true){
			index = 0;
		}
		else {
			index = p;
		}
		v.add(index, x);
	}
	
	//gibt das Element an der Stelle p in der Liste zurück
	public T get (int p){
		T element = null;
		element = v.elementAt(p-1);
		return element;
	}
	
	//gibt den Index eines Elements zurück
	public int indexOf (T x){
		int index;
		index = v.indexOf(x);
		return index;
	}
	
	//stellt fest, ob die Liste leer ist
	public boolean isEmpty(){
		return v.isEmpty();
	}
	
	
	//entfernt ein Element an der Stelle p und gibt es zurück 
	public T remove (int p){
		T element = get(p);
		v.remove(p-1);
		return element;
	}
	
	//gibt die Länge einer Liste zurück
	public int size(){
		return v.size();
	}
}

So sieht jetzt mein Code aus. Ich hatte noch so meine Probleme mit den Indizes und bin mir noch nicht 100%ig sicher, ob die Ausgabe stimmt. Aber dem ersten Blick hälts mal Stand 🙂
Aber sonst scheint es eigntlich so zu funktionieren, wie es soll. Oder hab ich was übersehen?

Was ich auch noch fragen wollte:
Ich programmiere mit Eclipse und da gibts ja eine umfangreiche Autovervollständigungsfunktion (STRG+Leertaste). Mir ist dabei aufgefallen, dass einige Methoden der Vector-Klasse, die man da auswählen kann z.T. etwas verblichener und mit einer auf 4 Uhr stehenden Uhr versehen sind. Hat das etwas zu bedeuten?

Achso, bevor ichs vergess: Danke für die Hilfe. Hat mir sehr geholfen!

Gruß
Eddie
 
die Uhr bedeutet, dass die Methode synchronized ist, eine spezielles Thema, für den Anfang nicht so spannend

für
> l.add(eins, "Kahn" );
> l.add(eins, "Rudi" );
> l.add(eins, "Bob" );
wird Rudi bei dir nach Kahn eingefügt, Bob landet dann zwischen Kahn und Rudi, jeder weitere genauso,
das ist nicht konsequent, du kannst nicht einfach nur bei leerer Liste aus 1 0 machen sondern wenn dann für alle Indexe die Systematik ändern

bei get rechnest du ja auch p-1
 

Zurück
Oben