Array in BlueJ aufrücken lassen?
Ich habe einen Array mit CDs (50 Plätze), die mit Titel, Autor und Erscheinungsjahr gespeichert werden, erstellt. Jetzt wollte ich die Funktion einbauen, dass man auch CDs löschen kann. Das funktioniert auch, nur dass die übrig gebliebenen CDs, die "über" der Gelöschten sind, nicht nach rücken. Also wenn die Erste CD gelöscht wird, soll die Cd auf dem zweiten Platz auf den Ersten rücken.
Habt ihr da eine Idee, wie ich das machen kann?
Vielen Dank schon mal im Voraus. :)
public void cdLoeschen (String pTitel)
{
boolean raus = false;
if(cdanzahl != 0)
{
for(int i=0;i<cdanzahl;i++)
{
if(cdSammlung[i].gibTitel()== pTitel)
{
cdSammlung[i] = null;
raus = true;
}
cdanzahl --;
}
}
else
{
System.out.println("Das CD-Regal ist leer, Sie koennen nichts loeschen!");
}
if(raus = true)
{
System.out.println("\"" + pTitel + "\" wurde geloescht!");
}
else
{
System.out.println("\"" + pTitel + "\" konnte nicht gefunden werden!");
}
}
Reden wir von der ArrayList Klasse? Die hat eine remove()-Methode.
Oder ist das irgendein eigenes Konstrukt?
Nein, es gibt keine remove()-Methode.
3 Antworten
Ich verwende kein Java, aber statt das Item auf Null zu setzen, musst du's entfernen. Ist cdSammlung denn eine ArrayList? Dann dürfte sie eine Remove oder RemoveAt Methode haben.
EDIT: Oder was meinst du mit "Array-Liste"? Einfach ein Array oder die Klasse ArrayList? (falls es die in java auch gibt) Wenn es ein Array ist, muss du in einer Schleife die nachfolgenden Items um jeweils eine Position nach oben schieben.
Deswegen hab ich dazu geschrieben mit einer Schleife. ;) .... Gab mittlerweile ne Antwort darauf, also tipp ichs jetzt nicht hier ein. Lesen kann ich den Java-Code zwar, aber selbst geschrieben hab ich noch keinen.
Folgend zwei Möglichkeiten.
Entweder du verrückst nur die Positionen der Elemente, lässt aber dann den null-Wert im Array. Das heißt, die letzten Positionen werden dann mit null-Werten belegt. So bleibt aber die Arraylänge erhalten, insofern das in irgendeiner Weise eine Rolle spielt.
Hier wird das erste Element einfach an die letzte Stelle gesetzt, alle anderen Elemente rücken um eine Stelle vor:
for (int i = 0; i < cds.length - 1; ++i) {
cds[i] = cds[i + 1];
}
cds[cds.length - 1] = null;
Die zweite Option wäre, alle null-Werte einfach herauszufiltern und somit auch das Array zu verkleinern.
Da du ja beim Löschen weißt, dass es jetzt nur ein Element auf null gesetzt wird, ist auch klar, dass das Array nur um ein Element kleiner wird. Man legt sich ein neues Array an, mit einer neuen Größe.
CD[] newCds = new CD[cds.length - 1];
Dann kopiert man sich via Schleife die Werte. Entweder wird je Iteration geprüft, ob die aktuelle Position den null-Wert enthält und dieser wird übersprungen oder, wenn es stets eine bestimmte Position ist (z.B. immer das erste Element), setzt man den Zähler bereits entsprechend.
for (int i = 1; i < cds.length; ++i) {
newCds[i - 1] = cds[i];
}
cds = newCds;
for(int i=0;i<cdanzahl;i++)
{
if(cdSammlung[i].gibTitel()== pTitel)
{
cdSammlung[i] = null;
raus = true;
if (i==cdzahl-1) break;
else cdanzahl--;
}
if (raus==true) cdSammlung[i]=cdSammlung[i+1];
}
So in etwa müßte das doch hinhauen ... ah vergessen, das NULLen beim rausnehmen kannst Du Dir sparen, Du mußt aber am Ende das ehemals letzte Element 0en.
Das eigentlich blöde ist doch eher, daß das Array nicht dynamisch umskaliert, willst Du das wirklich so machen?
Es ist ein Array, ich weiß auch, dass ich die nach oben schieben muss, aber nicht wie :)