OOP Methode: Anzahl der besetzten Arrayfelder zurückgeben

Kart0

Mitglied
Wie gebe ich mit der Methode int size() die Anzahl der besetzten Arrayfelder zurück für das Array Account[] account = new Account[4]; ?

Klasse Bank:
Java:
public class Bank {

  private int bankCode; //Bankleitzahl

  //Array
  Account[] account = new Account[4];

  //Konstruktor
  public Bank(int bankCode) {
    this.bankCode = bankCode;
  }

  public int length() {
    return account.length;
  }

  public int size() {
   
  }

  //set und get Methoden
  public void setBankCode(int bankCode) {
    this.bankCode = bankCode;
  }
   
  public int getBankCode() {
    return bankCode;
  }

}
 

Saheeda

Top Contributor
Da dein Array den Typ eines Objektes hast, sind nicht besetzte Felder null.
Du brauchst also nur über das Array iterieren (for-Schleife) und zählen, wie viele Felder ungleich null sind.
 

Kart0

Mitglied
Ist das so richtig? :

Java:
  public int size() {
    int count = 0;
    for (int i = 0; i < account.length; i++) {
      if (account[i] != null) {
        count += 1;
      }
    }
    return count;
  }

Sorry, ich bin noch totaler Anfänger :(
 

Kart0

Mitglied
Ich habe einen Account in meiner Main Klasse erstellt aber die Anzahl der besetzten Arrays ist immer noch auf 0.

Klasse Main:
Java:
public class Main {

  public static void main(String[] args) {
   
    Bank bank0 = new Bank(1);
    Account account0 = new Account(1,2);
    System.out.println("Anzahl besetzter Arrays: " + bank0.size());
  }

}
 

Saheeda

Top Contributor
Du erstellst ein Bank- und ein Account-Objekt. Aber du sagst nirgendwo, dass der Account zur Bank gehört. Das heißt, du brauchst in der Bank eine Methode addAccount(Account a), welche in Array der Bank Accounts speichert. Und du musst in der addAccount-Methode prüfen, welches die nächste freie Position im Array ist.
 

Kart0

Mitglied
Stimmt, das sollte ich eigentlich noch in einer anderen Aufgabe machen, aber ich dachte ich mach die Methode int size() zuerst weil die einfacher ist.
Also ich sollte eig zuerst die Methode int addAccount(int accountNumber) schreiben, die ein Konto mit der Kontonummer innerhalb der Bank erstellt. Jedes Konto erhält die Bankleitzahl der Bank.
Das neue Konto wird im ersten freien Feld des Arrays der Konten innerhalb der Bank eingefügt. Und die Methode gibt am Ende zurück zu welchem Array-Index das Konto hinzugefügt wurde.

Da hing ich schon vorher fest, weil ich es nicht schaffe einen int-Wert von Index zurückzugeben. Wie sollte ich vorgehen?
 

Saheeda

Top Contributor
Der Index ist doch immer ein Integer?!
Ich würde in der Methode über das Array iterieren und, genauso wie oben in der size-Methode, überprüfen, ob account an der Stelle i frei ist. Wenn ja, wird an dieser Position ein neuer Account angelegt und der Index i zurückgegeben.
Außerdem müsstest du dir noch überlegen, was passieren soll, wenn es keine freie Position mehr im Array gibt.
 

Kart0

Mitglied
Hab das nun mal probiert, aber anscheinend erstellt die Methode keinen Account:

Java:
public int addAccount(int accountNumber) {
    int index = 0;
    if (account[index] != null) {
      for (int i = 0; i < account.length; i++) {
        account[index] = new Account(this.bankCode, accountNumber);
      }
    }
    return index;
  }
 

Saheeda

Top Contributor
Du bist nah dran ;).

Nr. 1: Du fragst jedes Mal nur die Position 0 ab, da du index nicht änderst.
Nr. 2: Die Abfrage des Index' muss in der Schleife erfolgen, nicht außerhalb.
Nr. 3: Wenn die Position im Array frei ist, ist account gleich null.

Mein Vorschlag:
Java:
public int addAccount(int accountNumber) {  
    for (int i = 0; i < account.length; i++) {
        if (account[i] == null) {    
            account[i] = new Account(this.bankCode, accountNumber);
            return i;
      }
    }
    return -1;
}

Hast du ne Idee, warum ich am Ende -1 zurückgebe?
 

Kart0

Mitglied
Danke :) , das mit account == null und der Indexabfrage ist mir eben auch aufgefallen.

Ich schätze mal, weil es nach 4 erstellten Kontos keine freien Positionen mehr im Array gibt. Stimmt das?
 

Saheeda

Top Contributor
Ja.
Und: Wenn ich normalerweise eine Abfrage mache "gib mir bitte den Index von Objekt A zurück" (liste.indexOf(A)), die Liste aber kein A enthält, bekomme ich auch -1 zurück. 0 oder eine sehr große positive Zahl würde nur zu Missverständnissen führen.
 

Kart0

Mitglied
Ich möchte die Methode etwas abändern, jedoch klappt es nicht so wie ich es mag.

Wenn mehr Konten erzeugt werden als die Größe des Arrays, soll die Länge des Arrays um seine bisherige Länge verdoppelt werden, also in diesem Fall von 4 auf 8 usw. Das neue Konto soll dann wieder bei dem nächsten Index erstellt werden.

Ich denke die Länge des Arrays wurde verdoppelt, aber das Problem liegt wieder darin einen Account beim jeweiligen Index zu erstellen und den Index-Wert zurückzugeben.

Methode int addAccount(int accountNumber):
Java:
  public int addAccount(int accountNumber) {  
    for (int i = 0; i < account.length; i++) {
      if (account[i] == null) {    
        account[i] = new Account(this.bankCode, accountNumber);
        return i;
      }
    }
    for (int i = account.length; i < i * 2; i++) {
      if (i == account.length) {
        if (account[i] == null) {
          Account[] account = new Account[i * 2];
          account[i] = new Account(this.bankCode, accountNumber);
          return i;
        }
      }
    }  
    return -1;
  }
 

Saheeda

Top Contributor
Du verdoppelst die Länge des Arrays nicht, sondern zählst nur i hoch (und das falsch).

Wenn du ein neues, doppelt so langes Array anlegen willst, erzeugst du dir erst dieses Array und kopierst dann Wert für Wert das alte Array:

Code:
private void doubleLength() {
        Account[] newArray = new Account[this.account.length * 2];

        for (int i = 0; i < this.account.length; i++) {
            newArray[i] = this.account[i];
        }
        this.account = newArray;
    }

Zum Index:
Das zweite Argument der for-Schleife beinhaltet die Abbruchbedingung. Momentan steht bei dir "Laufe, solange i < 2 * i". Das ist ne Endlosschleife.

Der Rest bekommst du denke ich hin ;).
 

Kart0

Mitglied
Ich glaube ich habe es hinbekommen. Wenn ich ein neues Konto erstelle, bekomme ich immer den richtigen Index zurück.

Ich hoffe das stimmt so:
Java:
  public int addAccount(int accountNumber) { 
    for (int i = 0; i < account.length; i++) {
      if (account[i] == null) {   
        account[i] = new Account(this.bankCode, accountNumber);
        return i;
      }
    }
    Account[] newArray = new Account[this.account.length * 2];

    for (int i = 0; i < this.account.length; i++) {
        newArray[i] = this.account[i];
    }
    this.account = newArray;
  for (int i = 0; i < this.account.length * 2; i++) {
      if (account[i] == null) {   
        account[i] = new Account(this.bankCode, accountNumber);
        return i;
      }
    }
  return -1;
  }
 
Zuletzt bearbeitet:

Joose

Top Contributor
Ich hoffe das stimmt so:

Ausprobieren ;)

Es schaut zwar schon gut aus aber es ist noch ein Fehler drinnen.

Java:
this.account = newArray;
  for (int i = 0; i < this.account.length * 2; i++) {
  if (account[i] == null) {  
  account[i] = new Account(this.bankCode, accountNumber);
  return i;
  }
  }

Du weist der Variable "account" das neue Array zu, und in der darauffolgenden Schleife gehst du von "i bis account.length * 2".
Das ist ein bisschen zu viel ;)
Theoretisch könnte dies eine ArrayIndexOutOfBoundsException verursachen, wird es aber nie da davor dein Array sowieso verdoppelt wird.
Aber es sollte dir bewusst sein.


Ansonsten wäre noch eine kleine Optimierung möglich:
Java:
Account[] newArray = new Account[this.account.length * 2];
for (int i = 0; i < this.account.length; i++) {
   newArray[i] = this.account[i];
}
this.account = newArray;
for (int i = 0; i < this.account.length * 2; i++) {
   if (account[i] == null) {  
     account[i] = new Account(this.bankCode, accountNumber);
     return i;
   }
}

Du verdoppelst dein Array und kopierst die Account Objekte vom alten Array ins Neue um.
Danach gehst du in deinem Array wieder alle Elemente von Index 0 an durch. Du könntest aber gleich beim Index i (letzter Wert von der vorherigen Schleife) weitermachen.
Dadurch ersparst du dir immer ein paar Durchläufe :)
 

Kart0

Mitglied
Ich habe das mal geändert und ausprobiert. Es scheint zu funktionieren, aber wie schaffe ich es den letzten Indexwert der vorherigen Schleife der nächsten Schleife für i zuzuweisen. Ich habe jetzt dafür 4 zugewiesen, weil es ja da weiter laufen sollte.

Java:
  public int createAccount(int accountNumber) { 
      for (int i = 0; i < account.length; i++) {
        if (account[i] == null) {  
          account[i] = new Account(this.bankCode, accountNumber);
          return i;
        }
      }
      Account[] newArray = new Account[this.account.length * 2];

      for (int i = 0; i < this.account.length; i++) {
          newArray[i] = this.account[i];
      }
      this.account = newArray;
    for (int i = 4; i < this.account.length; i++) {
        if (account[i] == null) {  
          account[i] = new Account(this.bankCode, accountNumber);
          return i;
        }
      }
    return -1;
    }
 

Joose

Top Contributor
aber wie schaffe ich es den letzten Indexwert der vorherigen Schleife der nächsten Schleife für i zuzuweisen.

Java:
public int createAccount(int accountNumber) {
   int i = 0;
   for (; i < account.length; i++) {
     if (account[i] == null) {
       account[i] = new Account(this.bankCode, accountNumber);
       return i;
     }
   }
   Account[] newArray = new Account[this.account.length * 2];

   for (i = 0; i < this.account.length; i++) {
     newArray[i] = this.account[i];
   }
   this.account = newArray;
   for (; i < this.account.length; i++) {
     if (account[i] == null) {
       account[i] = new Account(this.bankCode, accountNumber);
       return i;
     }
   }
   return -1;
}

Im Initialiserungsteil der for-Schleife musst du nicht unbedingt eine Zählervariable anlegen.
Ich habe sie zum Beispiel die Zählervariable "i" ganz am Anfang der Methode deklariert und initialisiert.
In der 1.Schleife brauche ich sie nicht auf 0 setzen da sie ja gerade frisch initialisiert wurde mit 0.
In der 2.Schleife setzte ich sie wieder auf 0 und in der 3.Schleife mache ich ebenfalls nichts mit der Variable da ich ja mit dem aktuellen Wert weitmachen will.
 

Neue Themen


Oben