Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll

Juicerz

Mitglied
Hallo zusammen,

Ich habe eine kleine Frage.

Ich will eine Methode schreiben, die beliebig viele Objekte vom Typ Customer als Parameter entgegennehmen kann.
Jetzt kommts: Falls die Instanzvariable owners noch undefiniert ist, sollen die übergebenen Customer Objekte im Array owners gespeichert werden es es wird true zurückgegeben. Andernfalls wird owners nicht geändert und es soll false zurückgegeben werden.

Ich weiss jetzt nicht so richtig, ob das gut ist, was ich da gemacht habe, oder evtl. zu kompliziert. Bitte schaut es euch an. 🙂

Könnt ihr mir die Methode einfacher schreiben oder gar richtig? ^^ Danke!

Lg
 

Anhänge

  • Screenshot 2021-01-26 232825.jpg
    Screenshot 2021-01-26 232825.jpg
    51 KB · Aufrufe: 65
Java:
public class Account implements Comparable {
    
    private Customer[] owners;
    private String acctNumber;
    private double amount;
    
    private static int counter = 0;
    
    public Account(double amount) {
        this.amount = amount;
        DecimalFormat fmt = new DecimalFormat("00000");
        counter++;
        this.acctNumber = fmt.format(counter);
    }
    
    public boolean setOwner(Customer ... customers) {
        boolean full = false;
        
        for (int i = 0; i < owners.length; i++) {
            if (owners[i] != null) {
                full = true;
                return false;
            }
        }
        
        if (full == false) {
            for (int i = 0; i < owners.length; i++) {
                owners[i] = customers[i];
                return true;
            }
        }
        return full;
    }

    public int compareTo(Account other) {
        if (this.amount == other.amount) {
            return 0;
        } else if (this.amount > other.amount) {
            return 1;
        } else {
            return -1;
        }
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Und ein paar Hinweise zum Code, damit paar Denkfehler deutlich werden:
Java:
        boolean full = false;
        
        for (int i = 0; i < owners.length; i++) {
            if (owners[i] != null) {
                full = true;
                return false;
            }
        }

a) wenn owners auf kein Array verweist (null ist), dann gibt es eine NPE.

b) Du prüfst, ob es in owners Einträge gibt. Da wäre mir wichtig, den Unterschied zwischen "owners gesetzt" und "owners gesetzt aber leer" wichtig.

Java:
        if (full == false) {
c) Diese Prüfung macht keinen Sinn, denn full kann ja nicht true sein, da Du ja in dem Fall schon aus der Methode heraus gegangen wärst.

Java:
            for (int i = 0; i < owners.length; i++) {
                owners[i] = customers[i];
                return true;
            }
Die Anzahl der übergebenen customer kann unterschiedlich sein zu der Array Größe von owners. Daher ist hier die Chance groß, dass nicht alle Elemente kopiert werden (owners kleiner als customers) oder eine IndexOutOfBoundsException geworfen wird (owners größer als customers).
 
Java:
    public boolean setOwner(Customer ... customers) {
      
            if (owners == null) {
                 owners = customers;
                 return true;
            } else {
            return fase;
           }   
}

Und wenn man jetzt noch gleichzeitig kontrollieren möchte, ob die Liste bereits Inhalt hat und dann an der nächsten freien Stelle alle customers absetzen möchte? Dann wirds kompliziert was und einer ArrayList wäre gescheiter, aber wie würde das aussehen?

Irgendwie so...

Java:
    public boolean setOwner(Customer ... customers) {
        for (int i = 0; owners.length; i++) {
            if (owners[i] == null) {
                for (int j = 0; customers.length; j++) {
                    owners[i] = customers[j];
                    return true;
                }
            }
            return false;
        }
    }
 
Die ganze Aufgabe ist schwachsinnig, kann ich mir vorstellen, aber mich nimmts grad wunder wie das machbar wäre... wie wärs so?

Java:
    public boolean setOwner(Customer ... customers) {
        if (owners.length == 0) {
            owners = customers;
            return true;
        } else {
            for (int i = 0; i < owners.length; i++) {
                if (owners[i] == null) {
                    owners = customers;
                }
            }
            return false;
        }
    }
 
Und wenn man jetzt noch gleichzeitig kontrollieren möchte, ob die Liste bereits Inhalt hat und dann an der nächsten freien Stelle alle customers absetzen möchte? Dann wirds kompliziert was und einer ArrayList wäre gescheiter, aber wie würde das aussehen?
Das entspricht der addAll-Methode einer List. Kompliziert wird das nicht, aber ja, man nimmt dafür einfach eine List-Implementierung und muss das Rad nicht neu erfinden.

Wenn man das trotzdem tun möchte, könnte das schemenhaft etwa so aussehen:

Java:
public class Account {
    private Customer[] owners = new Customer[1];
    private int size; // Anzahl der in owners gespeicherten Customer-Objekte

    public void add(Customer owner) {
        int newSize = size + 1;
        enlargeCapacity(newSize);
        owners[size] = owner;
        size = newSize;
    }

    public void addOwners(Customer ... owners) {
        int newSize = size + owners.length;
        enlargeCapacity(newSize);
        System.arraycopy(owners, 0, this.owners, size, owners.length);
        size = newSize;
    }

    private void enlargeCapacity(int minSize) {
        if (minSize < owners.length) {
            return;
        }

        int capacity = owners.length;
        while (minSize > capacity) {
            capacity *= 2;
        }

        Customer[] newOwners = new Customer[capacity];
        System.arraycopy(owners, 0, newOwners, 0, size);
        owners = newOwners;
    }
}
 

Neue Themen


Zurück
Oben