Personenklasse und Objektearray

javanoob88

Aktives Mitglied
Hallo,

Ich möchte eine Personen-Klasse erstellen, wobei es darum geht, mehrere (beliebig viele) Personen mit bestimmten Merkmalen (siehe unten) zu speichern.
Hier erstmal die Personen-Klasse:
Java:
public class PersonFile {
    
    int ID;
    String Name;
    String Surname;
    int Age;
    String Gender;
    
    public void createPerson (int ID, String Name, String Surname, int Age, String Gender){
        
    }    
}

Nun: Ich vermute mal, dass hier das Problem ist, dass ich eigentlich einen Rückgabewert bräuchte, der mir die ganzen Eigenschaften zurückgibt. Kann ich das alles in einem einzigen String (toString??) zurückgeben oder so?

Weiter:
Java:
public class Person {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        
        PersonFile[] personList = new PersonFile [10];
        personList[0] = new PersonFile();
        personList[0].createPerson(1, "XYZ", "Peter", 22, "male");
        
        
        System.out.println("ID; Name; Surname; Age; Gender");
        System.out.println(personList[0].was?);
        
    }
}

So, nun dachte ich mir, dass es für den Anfang am einfachsten wäre, das ganze in einem Array mit Objekten zu speichern, wobei es hier sicher bessere Datenstrukturen gibt. (Btw, was würdet ihr hier als vorteilhaft sehen? Heap, Hashing oder was?)
Naja, mein Hauptproblem wird hoffentlich relativ klar. Wie kann ich denn hier nun mehrere Personen-Objekte erstellen und ausgeben?

Vielen Dank erstmal!
 

pHL

Aktives Mitglied
hallo,

ich würde es so lösen dass es keine createPerson Methode gibt, sondern man die Daten über einen Konstruktor erhält und dann die dazugehörigen get- Methoden zum holen der Daten verwendet.


mfg
 

javanoob88

Aktives Mitglied
also in der personFile:

Java:
this.ID = ID;
this. Name = Name;
...
Oder wie?

Wie ist die Syntax für get/set ?
 

energy47

Mitglied
das array ist doch in ordnung..
verpass der Klasse personFile noch eine toString() methode. damit jede erzeugte person weis wie sich sich ausgeben soll..
dann machst du nur noch den aufruf "System.out.prinlnt(personArray[0]);" und die toString methode wird automatisch dafür aufgeruffen..



edit:


ja genau, wie bereits gesagt.. zum erzeugen den konstruktor / konstruktoren benutzen und getter / setter ..
 

Atze

Top Contributor
simpel gesagt, einfach alle instanzwerte als string aneinander reihen und formatieren wie du es brauchst, und zurückgeben
 

javanoob88

Aktives Mitglied
Ok,

ich verstehe die toString Methode leider gar nicht. Muss ich jetzt jede einzelne Variable in eine toString Methode packen und sie dann zurückgeben? Checks grad leider überhaupt nicht mehr. ;( Code Beispielwäre gut.
 
G

gman

Gast
Mach es doch einfach so wie Atze es beschrieben hat. Im Klartext: Nein, du hast nur eine toString-Methode und
in der stellst du dir einen String zusammen der das enthält was du für wichtig hältst.
 

energy47

Mitglied
ganz locker beliben ;)

also du hast doch eine klasse die eine person beschreibt.. diese klasse muss die toString methode überschreiben.. dann hat doch logischerweise jedes objekt der person klasse auch die toString methode oder? :)
und wenn du ein array von personen machst.. dann kannst du über den array index auf einzelne personen zugreifen und die toString methode rufen..
Java:
public class PersonFile {
    
    int ID;
    String Name;
    String Surname;
    int Age;
    String Gender;
    
    public PersonFile(int ID, String Name, String Surname, int Age, String  Gender)
    {
        this.ID = id; this.Name = Name; this.Surname = Surname; this.Age = Age; this.Gender = Gender;

    }   
    
    // zb:
    public String toString()
    {
        return "Name: " + Name + "\nID: " + ID + "\nSurname: " + Surname; //und so weiter

    }
}
 

javanoob88

Aktives Mitglied
Hm...brauch ich dann nicht noch einen Konstruktor für meine PersonFile, damit ich ein neues Person Objekt erzeugen kann? Sowas in der Art meckert eclipse auch. (Hab die Klassennamen vertauscht, nicht wundern ;D)
Hier nochmal alles:
Java:
public class Person {

    int ID;
    String Name;
    String Surname;
    int Age;
    String Gender;
    
    public Person (int ID, String Name, String Surname, int Age, String Gender){
        this.ID=ID; 
        this.Name=Name;
        this.Surname=Surname;
        this.Age=Age;
        this.Gender=Gender;
    }
    public String toString(){
        return ID+";"+Name+";"+Surname+";"+Age+";"+Gender;
    }
}
public class PersonFile {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        
        Person[] personList = new Person [10];
        
        personList[0] = new Person(1, "XYZ", "Peter", 22, "male");
//ich muss doch dem neuen personenobjekt auch einen namen zuweisen können, mit dem ich es dann 
//aufrufen kann. ich erstelle hier wohl auf falsche weise das objekt
        
//das ganze soll ein wenig vorbereitung auf xml sein, deswegen diese ausgabe
        System.out.println("ID; Name; Surname; Age; Gender");
        System.out.println(personList[0]);  
    }
}
Danke!
 

eRaaaa

Top Contributor
Mhm? Was meckert denn Eclipse ? Fehlermeldungen sind hilfreich!

Java:
//ich muss doch dem neuen personenobjekt auch einen namen zuweisen können, mit dem ich es dann 
//aufrufen kann. ich erstelle hier wohl auf falsche weise das objekt

Mhm? mit [c]personList[0][/c] kannst du doch auf das Objekt zugreifen? ???:L
 

javanoob88

Aktives Mitglied
:eek: Oha...nun hab ich doch tatsächlich nicht abgespeichert. Der Code ist compilierbar, allerdings zeigt mir eclipse beim Ausführen an, dass es Fehler geben wird. Die Ausgabe ist dann allerdings korrekt.

Irgendwie find ich es immernoch seltsam, dass ich nun über meine erstellte Person nur über den Arrayeintrag (personList[0]) zugreifen kann. Wenn ich beispielsweise zusätzliche Methoden hätte, wäre es doch praktischer der Referenz, die da drin steck noch einen Namen zu geben oder?
 
G

gman

Gast
Hi,

du speicherst die ganzen Personen ja in einem Array. Damit hast du zwei Möglichkeiten
auf die einzelnen Personen zuzugreifen:

Java:
public class PersonFile {

    public static void main(String[] args) {

        Person[] personList = new Person [2];

        personList[0] = new Person(1, "XYZ", "Peter", 22, "male");
        personList[1] = new Person(2, "WXY", "Hans", 23, "male");

        // ausgabe mit foreach-schleife und Temp. Variablen
        for (Person person : personList) {
            System.out.println("Person: " + person.toString());
        }

        // ausgabe mit normaler Schleife ueber den Index
        for (int i= 0; i < personList.length; i++) {
            System.out.println("Person: " + personList[i].toString());
        }
    }
}

In der ersten Variante bekommst du eine temporäre Variable ("person") mit der
du auf die Funktionen des Objekts zugreifen kannst (hier "toString()").

Alternativ geht auch sowas, falls es das ist was dir vorschwebt:

Java:
        Person p1 = personList[0];
        Person p2 = personList[1];

        Map<String, Person> personMap = new HashMap<String, Person>();
        personMap.put(p1.Name, p1);
        personMap.put(p2.Name, p2);

        System.out.println("Person: " + personMap.get("WXY"));

Dann kannst du dir aus der Map anhand eines Namens das dazugehörige
Person-Objekt rausholen.

EDIT: Ausgabe für Map-Code hinzugefügt.
 
G

gman

Gast
Hi,

noch eine kleine Ergänzung bezüglich deines Programmierstils:

- Variablennamen fangen mit einem kleinen Buchstaben an
- Instanzvariablen (in deinem Beispiel "Name") am besten über getter/setter zugänglich machen, also:

Java:
    private String name;
    ....
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
 

javanoob88

Aktives Mitglied
Damit ich dich richtig verstehe:

Ich deklariere also die fünf Instanzvariablen private und brauche jeweils zwei Methoden, um sie zu initialisieren?!?
Was bringt mir das Ganze denn?
public Person (int id, String name, String surname, int age, String gender){
Das hier muss aber doch trotzdem bleiben, damit das Objekt die Attribute hat.
War das jetzt richtig (auch bezüglich Wortwahl und Namen)?
Danke nochmals.
 

energy47

Mitglied
die methoden "set" setzen einen wert der variablen.. die methoden "get" geben den wert der variablen wieder..
es dient der daten kapselung um einfach vorzubeugen dass beim zugrif auf die variablen irgend was schiefgeht.. es kann zb sein dass beim setzen die variablen einen bestimmten wert nicht über oder unterschreiten dürfen.. da zb dritte die deine klasse benutzen sowas vielleciht nicht beachten sorgt deine "set" methode dafür..

das gehöhrt einfach zum klassen design in java
 

javanoob88

Aktives Mitglied
Ok, also habe nun alles mit get/set gemacht, es gibt mir nun leider in meiner main Mathode (0, null, null, 0, null) aus, die Parameterübergabe hat wohl also gefailed. Wie ich oben schon gefragt habe:
Darf ich das trotz den get/set Methoden?
Java:
public Person(int id, String name, String surname, int age, String gender) {
}
Ich muss doch die Parameter meine Person Objekt übergeben...

Ich post lieber den Code nochmal:
Java:
package personFiles;

public class Person {

    private int id;
    private String name;
    private String surname;
    private int age;
    private String gender;

    public int getID() {
        return id;
    }

    public void setID(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Person(int id, String name, String surname, int age, String gender) {
    }

    public String toString() {
        return id + "; " + name + "; " + surname + "; " + age + "; " + gender;
    }
}
package personFiles;


public class PersonFile {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		Person[] personList = new Person [10];
		
		personList[1] = new Person(2, "XYZ", "xyz", 12, "male");
		personList[0] = new Person(1, "ABC", "abc", 10, "male");
		
		System.out.println("PersonID; Name; Surname; Age; Gender");
		System.out.println(personList[0]+"\n"+personList[1]);
		
	}

}
 

eRaaaa

Top Contributor
Java:
    public Person(int id, String name, String surname, int age, String gender) {
    }

Was soll das? Du musst natürlich die übergebenen Werte setzen

Java:
    public Person(int id, String name, String surname, int age, String gender) {
       this.id=id; this.name=name; //....
    }
 
G

Gast2

Gast
Java:
    public Person(int id, String name, String surname, int age, String gender) {
    }
Du übergibst im Konstruktor zwar die Variablen, weist diese aber nirgends zu.

Java:
public Person(int id, String name, String surname, int age, String gender) {
    this.id = id;
    this.name = name;
    ....
}
 

javanoob88

Aktives Mitglied
ok,

jetzt habe ich ja jeweils 2 konstuktoren...kommt mir ein bisschen viel vor :D

und noch was anderes: kann ich auf die array einträge in meiner main methode von einer anderen main methode zugreifen? so wenig sinn das auch machen mag ;D
 

energy47

Mitglied
manchmal ist es notwendig mehrere konstruktoren zu implementieren.. das hängt davon ab auf welche weise/n das objekt instanziert werden kann.. es können viele sein ;)

nun kannst du doch deine setter methoden im konstruktor zu initialisierung benutzen..
du kannst in einer klasse natürlich direkt die variable auf einen wert setzen oder die setter methoden ruffen und sie weiteres machen lassen..
wie schon gesagt, was wenn deine personen kein negatives alter haben dürfen.. darum kann sich die setter methode kümmern..
egal wo sie geruffen wird.. im konstruktor oder am objekt..
die überprüfung wird nur ein mal im setter implementiert und überall genutzt..
 

Neue Themen


Oben