# automatisch benannte arrays erstellen



## b3rtNATION (10. Mai 2015)

Hallo Leute, 
ich stehe hier vor einem kleinen Problem / hab vielleicht eine Denkblockade.

Mein Programm soll eine Datei einlesen. In der Datei sind verschiedene Menschen mit Attributen gelistet, z.B.:

## Ute
alter=23
gewicht=50
geschlecht=w

# Dirk
alter=40
gewicht=90
geschlecht=m

usw. 
Diese Menschen sollen jetzt automatisch angelegt werden und auch abgerufen werden können - also wenn man Dirk abruft auch sein alter etc. erhält.

Bin ich da mit Arrays auf dem Holzweg ? 
Könnte mir jemand einen Ansatz liefern, dass ich wieder weiter komme? 

Danke

gruß
b3rt


----------



## InfectedBytes (10. Mai 2015)

Erstmal solltest du eine Personen Klasse anlegen, in der du eben die Attribute wie Name, alter, etc. speicherst.

Wenn du weißt wieviele Leute in der Datei stehen, kannst du ein Array verwenden, ansonsten wäre eine Liste besser, da diese keine feste Größe hat. 

Alternativ wäre vielleicht auch eine Map interessant, da diese einen Schlüssel (in deinem Fall den Namen) auf einen Wert abbildet (in deinem Fall die Personen Objekte)


----------



## b3rtNATION (11. Mai 2015)

super danke erstmal! Ich hab jetzt jetzt erstmal mit klassen versucht


```
File test = new File("\\personen.txt");
String name = "";
int gewicht = 0;
int alter = 0;
String geschlecht = 0;
FileReader personen = new FileReader(test);
BufferedReader bufferedReader = new BufferedReader(personen);
while (bufferedReader.ready()) {
  String zeile = bufferedReader.readLine();
  String[] attribut = zeile.split("=");
  if (zeile.isEmpty()) {
    continue;
  } else {
    if (zeile.contains("## ")) { //???-> hier müsste der name gesetzt werden.. hab aber keine ahnung wie, da ich oben ja zeile.split("="), der name aber bei ## vorleigt
  } else if ("gewicht".equals(attribut[0])) {
    gewicht = Integer.valueOf(attribut[1]);
  } else if ("alter".equals(attribut[0])) {
    alter = Integer.valueOf(attribut[1]);
  } else if ("geschelcht".equals(attribut[0])) {
    geschlecht = String.valueOf(attribut[1]);
  }
  Person mensch = new Person(name, gewicht, alter, geschlecht);
  name = "";
  gewicht = 0;
  alter = 0;
  geschlecht = "";
}
```


Wenn ich den namen weglasse, erstellt er nun auch die erste Person. Sobald er aber zur nächsten Person wechselt, wird die erste wieder überschrieben.

Hier bräuchte ich nochmal hilfe 
danke

gruß
b3rt


----------



## InfectedBytes (11. Mai 2015)

Benutz bitte 
	
	
	
	





```
-tags für deinen code.
du kannst z.B. mit zeile.substring arbeiten
```


----------



## b3rtNATION (11. Mai 2015)

Jo mach ich das nächste mal, sorry.

Das mit dem Substring hab ich gemacht, funktioniert.
Weiterhin bleibt das Problem mit dem Überschreiben der Werte. 
Irgendeine Idee wie das Programm die Leute nach dem erstellen so ablegt, dass ich auf jede zugreifen kann und dann auch deren Werte bekomme?


----------



## InfectedBytes (11. Mai 2015)

du musst das Personen Objekt nachdem es erstellt wurde eben einem Array oder einer Liste hinzufügen.

```
ArrayList<Person> liste = new ArrayList<Person>();
while(...) {
//personen einlesen
Person person = new Person( ... );
liste.add(person);
}
```


----------



## b3rtNATION (11. Mai 2015)

Ok, das funktioniert jetzt anscheinend... er legt auf jeden Fall was in das Array. 

bloß wie bekomme ich denn jetzt die gesamten werte ausgegeben? wenn ich eine Position abfrage kommt: 


```
System.out.println(liste.get(0));
	System.out.println(liste.get(1));
```

testen.Port@659e0bfd
testen.Port@2a139a55

Wenn ich 

```
Person person = new Person( ... );
//hier greift er ja auch die Klasse Person zu und fügt eine neue Person hinzu
liste.add(person);
//wie kommt er denn hier an die Daten, die in Person liegen?
```

hier ein Auszug aus Person

```
public class Port {


	public String name;
	public int gewicht;
	public int alter
	public String geschlecht;


public Person(String name, int gewicht, int alter, String geschlecht {
		this.name = name;
		this.gewicht = gewicht;
		this.alter = alter;
		this.geschlecht = geschlecht;


	}
}
```
*​*


----------



## InfectedBytes (11. Mai 2015)

Dir scheinen ein wenig die Grundlagen zu fehlen, daher würde ich dir dringend ein Java Buch nahelegen. 
Ein gutes und kostenlosen Buch ist dieses hier: Rheinwerk Computing :: Java ist auch eine Insel - index

Wenn du alles nur mit System.out.println ausgeben willst, kannst du z.B. die toString methode von Person überschreiben.

```
public class Person {
  //...
  public String toString() {
    return name + ", " + alter + ... ;
  }
}
```
Ansonsten kannst du dir auch ein Personen Objekt aus der Liste holen und die Infos manuel abfragen:

```
Person p = liste.get(0);
System.out.println(p.name);
```


Ansonsten hab ich noch eine Anmerkung, du hast alle Variablen public gemacht. Im Allgemeinen ist es ratsamer diese private zu machen und für den öffentlichen zugang getter/setter zu nutzen:

```
public class Person {
  private String name;
  private int alter;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAlter() {
    return alter;
  }
  public void setAlter(int alter) {
    if(alter<0) throw new IllegalArgumentException(...);
   this.alter=alter;
  }
}
```
Die setter kannst du ggf. weg lassen. Außerdem kannst du im setter prüfen ob der übergebene Wert denn überhaupt sinnvol ist und ggf. eine Exception werfen, so wie in setAlter


----------



## b3rtNATION (11. Mai 2015)

Ja scheinbar  
Aber es funktioniert jetzt auf jeden Fall! 

Das mit sysout war nur um zu testen wie und wo er es ablegt. Mit dem aufrufen und der nachfolgenden Abfrage läuft es jetzt aber.

Vielen Dank !

Ich kann ja jetzt die einzelnen Positionen im Array aufrufen und dann die dazugehörigen Werte ausgeben lassen. 
Kann ich aber auch explizit nach Personen  suchen? 
Wenn zb Dirk an der position (0) ist ich fragen "an welcher Position ist Dirk" ?!


----------



## Joose (11. Mai 2015)

b3rtNATION hat gesagt.:


> Ich kann ja jetzt die einzelnen Positionen im Array aufrufen und dann die dazugehörigen Werte ausgeben lassen.
> Kann ich aber auch explizit nach Personen  suchen?
> Wenn zb Dirk an der position (0) ist ich fragen "an welcher Position ist Dirk" ?!



Stichwort: Schleife
Dann gehst du deine Liste Person für Person durch und vergleichst das Attribut "name" des aktuellen Objektes mit deinem gesuchten Namen. Stimmen die Namen (Strings) überein, hast du eine Person mit den Namen "XYZ" gefunden.

Dir fehlen wirklich noch Grundlagen, besorge dir für den Einstieg wirklich zuerst ein Buch (oder entsprechende Videos, PDFs aus dem Internet) und arbeite diese durch. (Hat dir  InfectedBytes schon geraten!)
In vielen dieser Tutorials wird auf solche Probleme eingangen


----------

