ArrayListe manuell programmieren?

Funktionierdochmal

Bekanntes Mitglied
upload_2019-1-13_14-55-34.png

Guten Tag,
ich habe ein Klassendiagramm gegeben (siehe Bild), das eine Klasse ArrayList darstellt. Nun habe ich gegooglet und herausgefunden, dass man ArrayLists importieren kann und Methoden wie add, remove etc. bereits von Java zur Verfügung gestellt werden können, was ICH in der Aufgabe wohl nicht darf.

Nun verstehe ich nicht genau wie ich vorgehen soll (2 Fragen): Bspw. steht an erster Stelle von ArrayList die Methode +ArrayList(). Heisst das, ich rufe einen Konstruktor auf mit einer leeren Liste "ArrayList eineListe = new ArrayList();" ?
2. Frage: Links, also ausserhalb des Pakets containers ist ein Java.lang.Object. Jemand ne Ahnung was das bedeuten soll?

upload_2019-1-13_14-59-40.png
 
Meiner Ansicht nach, sollst du eine eigene Klasse "ArrayList" inkl. "Container" und "List" programmieren. Die von Java bereitgestellte "ArrayList" sollst du nicht verwenden.

Deine erste Frage: Es handelt sich um den Konstruktor, den deine ArrayList gemäß Klassendiagramm haben soll.

Zur zweiten Frage: Hier wird festgelegt, dass die Daten in deiner ArrayList vom Typ "Object" sind.
 
So wäre das grobe Gerüst:

Java:
public abstract class Container {
   // ...
}

public abstract class List extends Container {
   // ...
}

public class ArrayList extends List {
   private Object[] data;

   public ArrayList() {
      // ...
   }
   // ...
}
 
Zuletzt bearbeitet:
Zu 1) Ja genau du hast einfach einen default Konstruktor
Zu 2) Die Verbindung im Klassendiagramm zu java.lang.object besteht einfach nur, da du anscheinend keine Generische Klasse programmieren sollst, sondern einfach nur intern ein Array mit "Object" Elementen anlegen sollst.
 
Wäre das für die add-Methode ein guter Ansatz?
Java:
package containers;
public class ArrayList extends List {
   
   
   
    ArrayList eineListe = new ArrayList();
   
    public void add(int pos, Object o) {
       
        eineListe[pos] = o;
       
        //ODER...
       
        for(int i = 0; i < eineListe.length, i++) {
            if(eineListe.length - 1 == i) {
               eineListe[i+1] = element;
            }
        }
    }
 
Äh, dir ist schon aufgefallen, dass du eben nicht ArrayList zur internen Speicherung der Daten nehmen sollst?

Außerdem steht in deinem Klassendiagramm, dass die Variable "data" heißt. Der Strich davor bedeutet, dass es sich um eine private Variable handelt.

Der Teil vor dem //ODER sieht nicht so verkehrt aus. Du solltest allerdings noch prüfen, dass du die Indexgrenzen nicht verletzt.
 
Java:
public class ArrayList() {
    private currentElement = 0;
    private Object [] list = new Object[5];

    public void add(Object o){
            if(list.length == currentElement) {
                //Erstelle Array mit mehr Elementen
            }else {
                //fuege Element an der Position von currentElement + 1 hinzu
        }
    }
}
Kleiner Denkanstoß
 
Java:
public class ArrayList() {
    private currentElement = 0;
    private Object [] list = new Object[5];

    public void add(Object o){
            if(list.length == currentElement) {
                //Erstelle Array mit mehr Elementen
            }else {
                //fuege Element an der Position von currentElement + 1 hinzu
        }
    }
}
Kleiner Denkanstoß

Da ist aber ein Fehler drin: Wenn das letzte Element des Arrays erreicht ist (die If-Bedingung), dann wird zwar das Array vergrößert, aber der else-Zweig mit dem Hinzufügen wird nicht mehr erreicht. Demnach wird auch kein Element hinzugefügt. Außerdem soll laut Aufgabe ein leeres Array erstellt werden, dass beim Hinzufügen immer um eins erweitert wird.
 
Hatte daran gedacht, dass Element in der if Anweisung hinzuzufügen. Aber man könnte das else natürlich auch weg lassen, hast du recht.
Kann man natürlich tun, aber der Kommentar passt nicht dazu...
Ich habe die Aufgabenstellung nicht ganz genau gelesen aber wenn das Array tatsächlich um immer nur eines erweitert werden soll ist das die Ineffizienteste ArrayList die ich je gesehen habe.
Genau das steht auch in der Aufgabenstellung 😉
 
Java:
public void add(Object o) {
      
        data[data.length++] = o;
    }

Ich habe daran gedacht, aber ein Fehlter unter length sagt mir "The final field array.length cannot be assigned"

Die Eigenschaft "length" von Arrays ist als "final" deklariert, d.h. du kannst sie nicht ändern. Ist ja auch logisch, da ein Array eine feste, unveränderliche Länge hat.
 
Java:
    public int at(Object o) {
        int pos = 0;
        int notFound = -1;
        for (int i = 0; i < data.length; i++) {
            pos++;
            if (o.equals(data[i])) { 
                return pos;
            } else {
                return notFound;
            }
        }
    }
eigentlich müsste ich nach der vorletzten geschweiften Klammer ein returnstatement setzen, die habe ich aber in der If-Schleife gesetzt. Irgendeinen geschickten Umweg, damit die Methode funktioniert?
 
Java:
    public int at(Object o) {
        for (int i = 0; i < data.length; i++) {
            if (o.equals(data[i])) {
                return i;
            }
       }
       return -1;
   }
 
Die Methode korrekt schreiben? Überleg mal, was in Deiner Schleife passiert, warum Du eine Schleife hast und was das if (insbesondere der else-Zweig) bewirkt.
Sorry, @mihe7. Ich neige nicht dazu fertige Lösungen zu liefern, aber da seine Lösung zwar umständlich ist, aber im Prinzip richtig, habe ich mal ne Ausnahme gemacht.

Edit: Wobei ich gerade bemerke, dass das "else" zu einem Abbruch nach der ersten Prüfung führt. 😳
 

Zurück
Oben