Datentypen ADT Implementierung (Array basics)

halloon

Mitglied
Hallo,

Ich habe im moment massive Probleme bei dieser Aufgabe und weiss garnicht wo ich ansetzen soll. Der Übersicht halber, habe ich die Aufgabe mal als .Png angehängt. Wie man unschwer erkennen kann, geht es um die Implementierung von ADTs in diesem speziellen Arrays. Ich hab mich so ziemlich überall über die Theorie schlau gemacht und weiss auch, dass Arrays nicht die beste Wahl sind, aber die Aufgabe sieht es nun einmal erstmal so vor. Den ersten Teil mit der "expandArray" Methode verstehe ich so, dass wenn ich sie aufrufe, das jeweilige Array hinterher doppelt "so groß" sein soll. Da das mit Arrays nicht möglich ist, habe ich mit folgendem Code die Referenz auf das alte Array "gelöscht" und "überschreibe" es mit einem doppelt so großem. Ich benutze "" hier sehr oft, weil ich mir extrem unsicher bin und nicht weiss, ob ich die Aufgabe überhaupt richtig verstanden habe.

public class main {

public static void main(String[] args) {

Object[] array = new Object[34];

array= new Object[ArrayList.expandArray(array).length];

// ArrayList.shiftClone(array, array.length);

}

}



public class MyClass {

public static Object[] expandArray(Object[] a)
{
Object[] newarray = new Object[a.length*2];

return newarray;
}

// public static void shiftValues(Object[] a, int i)
// {
//
// }
//
// public static Object[] shiftClone(Object[] a, int i)
// {
// Object[] b = a.clone();
// shiftValues(b, i);
// return b;
// }

}

Es wäre schön, wenn ihr mir das Brett vom Kopf nehmen könntet und mir n Schubs in die richtige Richtung gebt ;)
 

Anhänge

  • aufgabe 2.PNG
    aufgabe 2.PNG
    95,3 KB · Aufrufe: 31

Meniskusschaden

Top Contributor
Den ersten Teil mit der "expandArray" Methode verstehe ich so, dass wenn ich sie aufrufe, das jeweilige Array hinterher doppelt "so groß" sein soll. Da das mit Arrays nicht möglich ist, habe ich mit folgendem Code die Referenz auf das alte Array "gelöscht" und "überschreibe" es mit einem doppelt so großem.
In der Aufgabenstellung ist nicht gefordert, dass das ursprüngliche Array vergrößert wird, sondern nur eine doppelt so große Kopie des Arrays zu erstellen. Du mußt die Referenz auf das alte Array also nicht überschreiben.
 

halloon

Mitglied
wenn ich die expandArray Methode so umschreibe, müsste das doch gegeben sein oder nicht?

Java:
public static Object[] expandArray(Object[] a)
    {
        Object[] newarray = new Object[a.length*2];
        for(int i=0; i<a.length; i++)
        {
            newarray[i] = a[i];
        }
        return newarray;
    }

Sieht irgendwie nicht schön aus, aber meine Denkfähigkeit ist momentan irgendwie eingeschränkt durch diese Aufgabe :D
 

halloon

Mitglied
In der Aufgabenstellung ist nicht gefordert, dass das ursprüngliche Array vergrößert wird, sondern nur eine doppelt so große Kopie des Arrays zu erstellen. Du mußt die Referenz auf das alte Array also nicht überschreiben.

Ok. Aber ich denke nicht, dass es mir als Fehler angerechnet wird, wenn ich es mache. Kann ich aber auch noch abändern. Ich verstehe nur leider absolut nicht wie ich die mathematischen Ausdrücke zu deuten habe, und was die Methoden genau "machen" sollen.
 

Meniskusschaden

Top Contributor
Sieht irgendwie nicht schön aus,
Ist meines Erachtens so korrekt. Etwas unschön finde ich höchstens die Formatierung. In Java ist es eher üblich, die öffnenden geschweiften Klammern noch an das Ende der vorigen Zeile zu stellen. Also so:
Java:
    public static Object[] expandArray(Object[] a) {
        Object[] newarray = new Object[a.length*2];
        for(int i=0; i<a.length; i++) {
            newarray[i] = a[i];
        }
        return newarray;
    }
Ok. Aber ich denke nicht, dass es mir als Fehler angerechnet wird, wenn ich es mache.
Du machst es ja erst in der main-Methode, also bei der Benutzung von expandArray(). Das ist völlig in Ordnung. Es wäre meiner Ansicht nach aber falsch, wenn expandArray() das bereits tun würde.
 

halloon

Mitglied
Was die Formatierung angeht, hast du natürlich recht. Nichts was Ctrl+Shift+F nicht lösen kann :D. Wenn mir jetzt noch jemand den nötigen Denkanstoss für die anderen Methoden geben könnte, dann kann ich heute Nacht beruhigt schlafen ;)
 

halloon

Mitglied
Java:
public static void shiftValues(Object[] a, int i) {
        for(i=i; i<a.length; i++)
        {
            a[i] = a[i+1];
        }
    }

sieht irgendwie komisch aus mit dem i=i aber ich weiss grad garnicht, wie man die Schleifenzählervariable sonst von "außen" holt und nicht dort initialisiert. Jetzt müsste ich im Prinzip nurnoch prüfen, ob auch alle benötigten Indexe im Array vorhanden sind oder?

Edit: Sehe grad, dass ich die Werte nach hinten verschiebe. müssten also:
Java:
a[i+1] = a[i];
in der Schleife heissen.

Edit2: und der Schleifenkopf müsste so aussehen, damit nicht über das Ende der Indexe hinausläuft, richtig?:
Java:
for(i=i; i<a.length-i; i++)
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
i=i ist wirklich nicht schön. stattdessen könntest du auchfor(; i<a.length; i++)schreiben, was ich ebenfalls nicht gut finde. Ich würde die Laufvariable lieber anders nennen (für den Übergabeparameter ist i ja wohl vorgegeben). Du solltest die Methode aber lieber noch mal testen. Da sind trotz deiner eben eingefügten Korrektur noch zwei Fehler enthalten.
 

halloon

Mitglied
So, ich habe noch einmal alles überarbeitet, da mir aufgefallen ist, dass, wenn von zb. von [1] in [2] verschoben wird, der neue Wert von [2] in [3] und [4] und [5] und so weiter verschoben wird, und am Ende in allen Indexen für die gilt " > i ", steht der Wert von i. Also habe versucht das ganze von hinten aufzurollen und das jeweils letzte Element auf "null" zu setzen. Das ganze sieht dann wie folgt aus:
Java:
public static void shiftValues(Object[] a, int i) {

        int tempCounter = a.length - 1;

        for (int y = 0; y < a.length - i; y++) {

            if (y == a.length - i - 1) {
                a[tempCounter] = null;
            } else {
                a[tempCounter] = a[tempCounter - 1];
                tempCounter = tempCounter - 1;
            }
        }

    }

Ich habe es mit mehreren Arrays durchprobiert und wenn ich die Aufgabe jetzt endlich richtig verstanden habe, funktioniert es :D
 

Meniskusschaden

Top Contributor
Ja, das sieht gut aus. Du könntest noch zwei Vereinfachungen einbauen. In der Spezifikation wird nicht gefordert, dass das frei gewordene Element auf null gesetzt wird. Es wäre also nicht falsch, es einfach auf dem alten Wert zu belassen und dadurch die if/else-Verzweigung zu sparen (mit dem Rücksetzen auf null ist es aber vielleicht doch schöner).

Du könntest die Laufvariable in der for-Schleife von hinten bis zur passenden Position laufen lassen und dadurch tempCounter einsparen.
 

Neue Themen


Oben