Zum Inhalt springen
  • 0

Array auf Leerstellen prüfen


 Teilen

Frage

Moinsen zusammen,

ich hab irgendwie momentan entweder einen dicken Denkfehler oder Java und Eclipse wollen heute nicht. Ich vermute ersteres 

Es geht darum , dass ich ein Array aufräumen will während der Laufzeit. Es ist ein Array mit dem Objekttyp Artikel. Wir sollen als Aufgabe ein Programm schreiben, womit wir quasi Artikel verwalten können und dazu gehört eben auch, dass man Artikel löschen kann an jeder x- beliebigen Stelle. Sobald diese gelöscht sind, steht an der Stelle ein Artikelobjekt mit der Artikelnr 0 bei mir.

Ich hab eine Methode mit einer for Schleife geschrieben, die die Leerstelle raussucht und den Nachfolgerartikel um 1 Platz nach vorne verrückt um.

BSP:

[ A1; A2; A3;A4;A5]

A3 wird gelöscht

[ A1; A2; 0 ;A4;A5]

So sollte es aussehen :

[ A1; A2; A4;A5; 0]

So sieht es bei mir aus :

[ A1; A2; A4;A5;A5]

Hier der Quellcode und die fehlerhafte Ausgabe :

Code:
    public void pruefeLeerstellen() {
        Artikel [] sortieren = aktuelleListe;
        int temp = 0;
        Artikel neu = null;
       
        for (int i = 0; i < aktuelleListe.length; i++) {
            if (sortieren[i].getArtikelnr() != 0 ) {
                if (aktuelleListe[temp] != aktuelleListe [temp+1]) {
                    neu = sortieren[i];
                    aktuelleListe[temp] =neu;
                    temp++;
                }
            }
        }
    }

" Welche Artikelnummer hat der zu löschende Artikel ? : 2
Der Artikel wurde gelöscht !
Cola Zero 0,5 l | Artikelnr : 1. | Bestand: 50 Stk. | Preis: 1.2 €/Stk. |
Hier könnte Ihr Artikel stehen ! | Artikelnr : 0. | Bestand: 0 Stk. | Preis: 0.0 €/Stk. |
Cola Vanille 1,0 l | Artikelnr : 3. | Bestand: 60 Stk. | Preis: 1.8 €/Stk. |
Smirnoff Red 0,7 l | Artikelnr : 4. | Bestand: 10 Stk. | Preis: 13.5 €/Stk. |
Grey Goose 0,7 l | Artikelnr : 5. | Bestand: 4 Stk. | Preis: 39.99 €/Stk. |
Hier könnte Ihr Artikel stehen ! | Artikelnr : 0. | Bestand: 0 Stk. | Preis: 0.0 €/Stk. |
Erneute Eingabe ? (j/n) j
Cola Zero 0,5 l | Artikelnr : 1. | Bestand: 50 Stk. | Preis: 1.2 €/Stk. |
Cola Vanille 1,0 l | Artikelnr : 3. | Bestand: 60 Stk. | Preis: 1.8 €/Stk. |
Smirnoff Red 0,7 l | Artikelnr : 4. | Bestand: 10 Stk. | Preis: 13.5 €/Stk. |
Grey Goose 0,7 l | Artikelnr : 5. | Bestand: 4 Stk. | Preis: 39.99 €/Stk. |
Grey Goose 0,7 l | Artikelnr : 5. | Bestand: 4 Stk. | Preis: 39.99 €/Stk. |
Hier könnte Ihr Artikel stehen ! | Artikelnr : 0. | Bestand: 0 Stk. | Preis: 0.0 €/Stk. |
Welche Artikelnummer hat der zu löschende Artikel ? : "


Mein Gedanke dazu: Ich brauche ja eine for-Schleife, die erstmal einfach nur durch das Array durchgeht.
An jeder Stelle, wo die Artikelnummer ungleich 0 ist, soll der Artikel in eine temporäre "neu" Variable geschrieben werden.

Diese neu variable wird eingesetzt an der Stelle aktuelleListe[temp]. Und temp wird für jeden gefundenen Artikel um einen hoch gezählt.

Ich hab bereits versucht den Fehler damit abzufangen, wenn ich sage if (aktuelleListe[temp] != aktuelleListe[temp+1]). Das ignoriert Eclipse dezent, der Nachfolgeartikel kann genau der gleiche Artikel sein, wie der an der aktuellen Stelle.

Weitherhin wollte ich es versuchen, indem ich eine 2 for schleife in die "Hauptschleife" reinschreibe und quasi jedes mal wenn i um einen erhöhe, der nochmal durch die ganze Liste geht und alle Duplikate rausschmeisst. Gleiches Ergebniss wie vorher...

Ich weiss echt nicht weiter. Vielleicht sieht das ja einer von euch so auf die Schnelle, was da jetzt die richtige Vorgehensweise wäre..
Ich wäre auch für Tipps dankbar 

Vielen Dank !

Link zu diesem Kommentar
Auf anderen Seiten teilen

5 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

Moin!

Ein Array ist eine Datenstruktur mit fester Größe. Das Hinzufügen und (vollständige) Entfernen (=nicht Überschreiben) von Objekten ist "teuer", da ein neues Array erzeugt werden muss. Insofern ist dein Vorgehen mit dem Erstellen eines neuen Artikel[] schon korrekt.

Eine Möglichkeit, die du umsetzen könntest, wäre wie folgt:

  • Erzeuge ein neues, leeres Artikel[]
  • Iteriere per for-Schleife (Zählerschleife - den Zähler brauchst du als Index, dann kannst du dir auch temp sparen) über dein existierendes Array
  • Wenn das aktuelle Objekt dem zu löschenden Artikel entspricht, dann ignoriere es (continue;)
    • (vielleicht hat die Artikel-Klasse ja eine gute equals()-Implementierung? Vorschlag: equals() implementieren mit Artikelnummer als Vergleichsfaktor. Wenn du dabei Unterstützung brauchst, sag Bescheid)
  • Wenn nicht, dann füge das aktuelle Objekt dem neuen Artikel[] hinzu
  • Gib nach Durchlaufen der Schleife das Neue, nun mit allen außer dem zu löschenden Artikel gefüllte Artikel[], zurück.

Wenn die Aufgabenstellung nun darauf ausgelegt ist, Leerstellen im Array zu finden (Sprich: Die eigentliche Löschfunktionalität ist schon vorgegeben und [ A1; A2; 0 ;A4;A5]  ist der Input für die Methode, die du schreiben sollst), kannst du genauso vorgehen, bis darauf, dass du überprüfst, ob das Objekt, an dem du in deiner Schleife gerade bist, 0 ist (oder 0 als Artikelnummer hat oder was auch immer).

2 Schleifen sind meiner Meinung nach hier vollkommen überflüssig.

Ich hab eine kleine Bonusaufgabe für dich: Welche Datenstruktur wäre für die Abbildung von diesem Fall besser geeignet als ein Array? :)

Viele Grüße

peov

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

Hallo,

ich möchte gar nicht auf die konkrete Aufgabenstellung eingehen, dass hat ja mein Vorposter schon getan.

Allerdings noch einen Tipp am Rande. Es kann hilfreich sein, die IDE im Debug Modus schrittweise laufen zu lassen und Breakpoints zu setzen und die Variablenwerte dabei zu untersuchen. (Wenn es um das Verständnis geht, was wann im Programm eigentlich abläuft und welche Werte die Variablen im Speicher haben).

Bei Eclipse ist das etwas umständlicher. Du hättest aber auch die Möglichkeit z.B. für die Dauer Deiner Ausbildung als Schüler eine Lizenz von Jetbrains für IntelliJ zu bekommen. Die haben eine sehr schöne Debug-Umgebung, die manchmal dabei hilft, solche Knoten im Kopf zu lösen.

Natürlich ist und bleibt der beste Debugger der Kopf in Verbindung mit intensivem Nachdenken. Aber wenn es Tools gibt, die helfen können bei der Suche des Fehlers, sollte man sie auch einsetzen.

Ja und natürlich ist es auch wichtig, die richtige Datenstruktur für die richtige Aufgabe zu finden. Dazu gibt es auch ein paar gute Bücher mit dem Thema Algorithmen und Datenstrukturen.

Gruß

Thorsten

Bearbeitet von tkreutz2
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 11 Stunden schrieb peov:

Eine Möglichkeit, die du umsetzen könntest, wäre wie folgt:

  • Erzeuge ein neues, leeres Artikel[]
  • Iteriere per for-Schleife (Zählerschleife - den Zähler brauchst du als Index, dann kannst du dir auch temp sparen) über dein existierendes Array
  • Wenn das aktuelle Objekt dem zu löschenden Artikel entspricht, dann ignoriere es (continue;)
    • (vielleicht hat die Artikel-Klasse ja eine gute equals()-Implementierung? Vorschlag: equals() implementieren mit Artikelnummer als Vergleichsfaktor. Wenn du dabei Unterstützung brauchst, sag Bescheid)
  • Wenn nicht, dann füge das aktuelle Objekt dem neuen Artikel[] hinzu
  • Gib nach Durchlaufen der Schleife das Neue, nun mit allen außer dem zu löschenden Artikel gefüllte Artikel[], zurück.

Wenn es darum geht, Elemente aus einem Array zu löschen und das Löschkriterium selbst im Element steht (in diesem Fall die Artikelnummer), dann reicht auch eine foreach-Schleife. Ein Zähler ist nämlich nicht vonnöten, da nicht der Index interessant ist, sondern eine Klassenvariable.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
vor 13 Minuten schrieb Whiz-zarD:

Wenn es darum geht, Elemente aus einem Array zu löschen und das Löschkriterium selbst im Element steht (in diesem Fall die Artikelnummer), dann reicht auch eine foreach-Schleife. Ein Zähler ist nämlich nicht vonnöten, da nicht der Index interessant ist, sondern eine Klassenvariable.

Stimmt! War gestern Abend schon spät :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

 Teilen

Fachinformatiker.de, 2022 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung