Inkrement von Variable

busgi

Aktives Mitglied
Hallo zusammen,

Ich habe eine etwas komplizierte Inkrement-Aufgabe. Ich möchte Personen in einer Verwaltung speichern. Bei jedem neuen Eintrag einer Person erfolgt eine automatische Vergabe der eindeutigen Id. Das erste Objekt soll die Id mit dem Wert 0 bekommen. Für jede neue Person der in die Verwaltung aufgenommen wird, soll die Id automatisch um den Wert 1 hochgezählt werden.

Wie könnte ich das besser programmieren? Im Code-Abschnitt habe ich folgendes versucht: Ich habe eine Hilfsvariable counterId für das hochzählen verwendet. Wenn ich z.B. equals aufrufe und die Namen von v1 und v2 vergleichen soll, soll er sich die IDs der Personen merken. Also sprich counterId.

Code:
public class Verwaltung {
    private int id;
    private String person;
    private static int counterId;

    public Verwaltung(int id, String person) {
        this.person = person;
        this.id = counterId;
        counterId++;

    }

    public static int getCounterId() {
        return counterId;
    }

    public String getPerson() {
        return person;
    }
    public String toString() {
        return "ID: " + getCounterId() + " , Person: " + getPerson();
    }
    public boolean equals(Object obj) {
        if (!(obj instanceof Medium)) {
            return false;
        }
        Verwaltung b = (Verwaltung) obj;
        if (this.person != b.person) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {

        Verwaltung v1 = new Verwaltung(getCounterId(), "Hans Peter");
        System.out.println(v1.toString());
        Verwaltung v2 = new Verwaltung(getCounterId(), "Hans Peter");
        System.out.println(v2.toString());

        if (v1.equals(v2)) {
            System.out.println("Personen sind gleich");
        } else {
            System.out.println("Die Person mit der ID " + v1.getCounterId() + " und die Person mit ID " + v2.getCounterId() + " sind nicht gleich");
        }
    }
}

Als Ausgabe bekomme ich:
ID: 1 , Person: Hans Peter
ID: 2 , Person: Hans Peter
Die Person mit der ID 2 und die Person mit ID 2 sind nicht gleich

Das ist ja leider so nicht richtig. Ich mache irgendwas mit der counterId falsch... Ich komme einfach nicht zu der Lösung 🙁
 
Der Teil mit der ID ist zumindest korrekt (man könnte es verschönern, der erste Schritt wäre zB einfach eine Methode, die dir die ID zurück gibt und direkt auch den Zähler erhöht).

Der Fehler liegt in der equals-Methode, und dort gleich an zwei Stellen.

Einmal dies, was hat die Klasse Medium da zu suchen?
Java:
if (!(obj instanceof Medium)) {
    return false;
}


Und dann dies, Strings vergleicht man mit equals, nicht mit == bzw !=:
Java:
this.person != b.person


EDIT: und dann klingt es zumindest rein logisch komisch. Wenn man mit IDs arbeiten, sollten nur diese für Gleichheit relevant sein, der Name aber irrelevant.
Einfaches Beispiel ist zB Steuer-ID.
Zwei Personen mit zufällig gleichem Namen aber anderer Steuer-ID sind verschiedene Personen.
Eine Person hat eine fester Steuer-ID, und auch wenn sie ihren Namen ändert, ist danach immer noch die selbe Person 😉
 
Hmm, vielen Dank schon mal. Ich habe mal ein paar Änderungen getätigt.
Die Id im Konstruktor habe ich mal rausgenommen (müsste eigentlich denke ich drin bleiben)
@msBrown die equals Methode habe ich überarbeitet. Die Klasse Medium war eine andere Aufgabe...

Ich komme so trotzdem nicht auf das richtige Ergebnis. Die Id ist problematisch

Code:
public class Verwaltung {
    private int id;

    private String person;

    public static int counter = 0;

    public Verwaltung(String person) {

        this.person = person;
    }

    public int getId() {
        counter = counter + 1;
        id = counter;
        return id;
    }

    public String getPerson() {

        return person;

    }

    public String toString() {

        return "ID: " + getId() + " , Person: " + getPerson();

    }

    public boolean equals(Object obj) {
        if (!(obj instanceof Verwaltung)) {
            return false;
        }
        Verwaltung b = (Verwaltung) obj;
        if (this.person.equals(b.person)) {
            return false;
        }

        return true;

    }

    public static void main(String[] args) {

        Verwaltung v1 = new Verwaltung("Hans Peter");
        System.out.println(v1.toString());
        Verwaltung v2 = new Verwaltung("Hans Peter");
        System.out.println(v2.toString());

        if (v1.equals(v2)) {
            System.out.println("Personen sind gleich");
        } else {
            System.out.println("Die Person mit der ID " + v1.getId() + " und die Person mit ID " + v2.getId() + " sind nicht gleich");
        }

    }

Ausgabe ist:
ID: 1 , Person: Hans Peter
ID: 2 , Person: Hans Peter
Die Person mit der ID 3 und die Person mit ID 4 sind nicht gleich (hier wird es nochmal inkrementiert... -.-)
 
Naja, guck dir mal den Getter für die ID an. Jedes Mal wenn du die ID abfragst, wird eine neue zugewiesen.


Der ursprüngliche Code war da schon richtiger: im Konstruktor muss die ID zugewiesen werden, und danach darf sie sich niemals ändern.
 
Naja, guck dir mal den Getter für die ID an. Jedes Mal wenn du die ID abfragst, wird eine neue zugewiesen.


Der ursprüngliche Code war da schon richtiger: im Konstruktor muss die ID zugewiesen werden, und danach darf sie sich niemals ändern.

So ich habe nun die richtige Lösung raus. Verstehe aber den Zusammenhang nicht. In der main habe ich Verwaltung. counterId aufgerufen und zack hat es geklappt. 🤷‍♀️

Code:
package pk01;

public class Verwaltung {
    private int id;

    private String person;

    private static int counterId = 0;

    public Verwaltung(int id, String person) {

        this.person = person;
        counterId++;
        this.id = counterId;

    }

    public int getId() {
        return id;
    }

    public String getPerson() {

        return person;

    }

    public String toString() {

        return "ID: " + getId() + " , Person: " + getPerson();

    }

    public boolean equals(Object obj) {
        if (!(obj instanceof Medium)) {
            return false;
        }
        Verwaltung b = (Verwaltung) obj;
        if (this.person.equals(b.person)) {
            return false;
        }

        return true;

    }

    public static void main(String[] args) {

        Verwaltung v1 = new Verwaltung(Verwaltung.counterId, "Hans Peter");
        System.out.println(v1.toString());
        Verwaltung v2 = new Verwaltung(Verwaltung.counterId, "Hans Peter");
        System.out.println(v2.toString());

        if (v1.equals(v2)) {
            System.out.println("Personen sind gleich");
        } else {
            System.out.println("Die Person mit der ID " + v1.getId() + " und die Person mit ID " + v2.getId() + " sind nicht gleich");
        }

    }

}

Ausgabe:
ID: 1 , Person: Hans Peter
ID: 2 , Person: Hans Peter
Die Person mit der ID 1 und die Person mit ID 2 sind nicht gleich
 
So ich habe nun die richtige Lösung raus. Verstehe aber den Zusammenhang nicht. In der main habe ich Verwaltung. counterId aufgerufen und zack hat es geklappt. 🤷‍♀️
Auf die drei Sätze geantwortet: Nein. Das wundert mich nicht. Denn daran liegt es nicht.

Den Parameter id des Konstruktors musst Du entfernen, der ist nämlich überflüssig.
 
Java:
public class Verwaltung {
	private static final Set<Integer> ID_SET = new HashSet<>();

	private int id;

	private String person;

	private static int nextId() {
		while (true) {
			final int rand = new Random(0).nextInt();
			if (!ID_SET.contains(rand)) {
				ID_SET.add(rand);
				return rand;
			}
		}
	}

	public Verwaltung(String person) {
		this.person = person;
		this.id = nextId();
	}

	public int getId() {
		return id;
	}

	public String getPerson() {
		return person;
	}

	public String toString() {
		return "ID: " + getId() + " , Person: " + getPerson();
	}

	@Override
	public int hashCode() {
		return id;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Verwaltung other = (Verwaltung) obj;
		return id == other.id;
	}

	public static void main(String[] args) {
		Verwaltung v1 = new Verwaltung("Hans Peter");
		System.out.println(v1.toString());
		Verwaltung v2 = new Verwaltung("Hans Peter");
		System.out.println(v2.toString());

		if (v1.equals(v2)) {
			System.out.println("Personen sind gleich");
		} else {
			System.out.println("Die Person mit der ID " + v1.getId() + " und die Person mit ID " + v2.getId()
					+ " sind nicht gleich");
		}
	}
}
 

Zurück
Oben