Geburtstage von Personen

Status
Nicht offen für weitere Antworten.

Sindbad1983

Top Contributor
Hi!

Ich hab jetzt lange gesucht, bin aber Gott sei Dank doch noch fündig geworden! -ein neues Beispiel zum Üben! :###

Ich soll ein Programm zur Verwaltung von Personen mit Geburtstagen programmieren.
1.eine Klasse Person, die Personen mit Name (Vorname und Nachname) und Geburtsdatum
darstellt. Für das Datum soll dabei eine eigene Klasse Date implementiert werden.
2.Methode Person readPerson(), die die Daten einer Person einliest, und
eine Methode printPerson(Person p), die die Daten einer Person ausgibt.
3. Die Personen sollen in einem Array der Länge 100 (maximal 200 Personen möglich) verwaltet
werden. -> dazu eine Methode addPerson(Person p), um eine Person im Array zu
speichern.
4.dann noch die Methoden boolean isBornInYear(Person p, int year), boolean
isBornInMonth(Person p, int month), boolean isBornOnDay(Person p,
int month, int day) und boolean isBornAt(Person p, Date d), die testen, ob
eine Person in einem bestimmten Jahr, in einem bestimmten Monat, an einem bestimmten Tag bzw.
an einem bestimmten Datum geboren ist.
5. main-Methode, die Personen von einer Datei einliest und diese im Array
speichert. Es sollen dann alle Personen, die an einem bestimmten Jahr, Monat, Tag bzw. Datum
(einzulesen von der Konsole) geboren sind, ausgegeben werden.


Ich weiß, die Angabe ist etwas lang, aber man soll ja wissen, worums geht!

Nur mal für die Grundverständnis:
Ich hätt da jetzt mal 3 Klassen geschrieben:

Klasse Person:
Name
Vorname
Date geburtsdatum
-------------
readPerson()
printPerson()
addPerson()

-------------------------------------------------------------
Klasse Date:
Jahr
Monat
Tag
---------------
isBornin Year()
isBorninMonth()
isBorninDay()
-------------------------------------------------------------
und Klasse TestDate:
main-Methode:
hier erzeug ich die verschiedenen Person-Objekte im Array:

z.B. int [] Person =new int [200]
und den BufferedReader

aber wie ich mit addPerson() dann eine neue Person ins Array reinhäng is mir glaub ich noch nicht klar... ???:L

würdet ihr das auch mal so aufteilen?
Dann werd ich jetzt gleich mal mit der Implementierung beginnen! :toll:
Danke!
 

foobar

Top Contributor
Du brauchst noch eine Klasse PersonenVerwalter mit den Methoden readPerson() und addPerson(), denn die Klasse Person ist eine Entity und hat somit keine Informationen über eine Datenstruktur in der Personenobjekte gespeichert werden.

aber wie ich mit addPerson() dann eine neue Person ins Array reinhäng is mir glaub ich noch nicht klar...
Wo liegt das Problem?
Code:
public class PersonManager
{
   private int personCounter;
   private Person[] data;
   public void addPerson(Person p)
   {
       this.data[personCounter++] = p;
   }
}
 

Student

Top Contributor
Sindbad1983 hat gesagt.:
oder kann ich die main-Methode in PersonManager integrieren?
würde ich schon aus designgründen nicht machen.

die klasse mit der main-methode sollte eigentlich nicht wirklich etwas enthalten, außer methodenaufrufe ;-)
 

Sindbad1983

Top Contributor
wenn da jetzt in der Datei z.B

Franz Huber 24,12,1980

steht...dann muss ich aber String und int schon getrennt behandeln, oder?
 

Sindbad1983

Top Contributor
auf Deutsch..ich brauch nen Tokenizer! ;-(

Oh Mann...aber wie ich da dann differenziere zw. String und int... :cry:

weil:

Code:
	try{

		BufferedReader rb=new BufferedReader(new FileReader("C://Downloads/Geburtstag.txt"));

		String s=rb.readLine();
		
                                StringTokenizer tok=new StringTokenizer(s);

                                while(tok.hasMoreTokens){
                                    for(int i=0;i<data.length;i++){
                                            data[i]=tok.nextToken();
                                    }
                                }

		}
		catch(IOException e){};

das stimmt wohl nicht! :cry:
 

foobar

Top Contributor
Code:
catch(IOException e){};
Wenn du eine Exception fängst, lass dir zumindest den Stacktrace ausgeben, ansonsten schaffst du dir nur unnötig Probleme.

Mal angenommen dein CSV sieht so aus:
Code:
Vorname 1;Nachname 1;1;1;1980;
Vorname 2;Nachname 2;2;2;1960;
dann weißt du doch genau in welchem Feld welcher Datentyp enthalten ist und kannst entsprechend casten.

Code:
PersonManager manager = new PersonManager();
try{

      BufferedReader rb=new BufferedReader(new FileReader("C://Downloads/Geburtstag.txt"));

      String s=rb.readLine();
      
                                StringTokenizer tok=new StringTokenizer(s);

                                while(tok.hasMoreTokens)
                                {
                                    Person p = new Person();
                                    p.setFirstName( tok.nextToken());
                                    p.setLastName( tok.nextToken());
                                     ........
                                    manager.addPerson( p );
                                }

      }
   catch(IOException e)
  {
     e.printStacktrace();
  };
 

SebiB90

Top Contributor
ich mach das auch mal zur übung und hab mal ne frage
wie kann ich die daten verschlüsselt speichern?
 

SebiB90

Top Contributor
lern ich ja in der schule(8.Klasse)
das blöde ist, manche sachen versteh ich nicht einmal auf deutsch wie soll ich es dann auf englisch verstehen :roll:
 

Sindbad1983

Top Contributor
ich werd mich erst am Mi wieder mit dem Beispiel beschäftigen..mir ist leider etwas dazwischen gekommen!
Freut mich, dass es für andere auch interessant ist!
Ich hoff, ich darf am Mi auch noch Fragen stellen...!?!
Gute Nacht!
Tommy
 

SebiB90

Top Contributor
ne darst keine fragen stellen :wink:
ich werd versuchen daraus ein organizer(oder wie wird das geschrieben) zu machen
hab ich wenigstens ne gute übung

danke für die idee
 

SebiB90

Top Contributor
kann man auch eine instance von der klasse Person in einer datei schreiben und dann wieder auslesen oder muss man alle daten einzeln schreiben und wieder einlesen?
 

dotlens

Top Contributor
alle Objekte die Serializable implementieren kannst du serialisieren und deserialisieren. als genau das was du möchtest. dafür benötigst du writeObject() in java.io
 

dotlens

Top Contributor
weil ich denk dass du dir mühe gegeben hast :D
Code:
import java.beans.*;
import java.io.*;
import java.util.*;


/**
 * @author ??? sag ich net ???
 *
 */
public class SerizableAndDeserizable {

	public static void main(String[] args) {
		SerizableAndDeserizable ser = new SerizableAndDeserizable();
		
		String filename = "serizable.txt";
		try {
			ser.serizable(filename);
			ser.deserizable(filename);
		}
		catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	void serizable(String filename) throws FileNotFoundException{
		XMLEncoder coder = new XMLEncoder(new FileOutputStream(filename));
		coder.writeObject("heute");
		coder.writeObject(new Date());
		coder.flush();
		coder.close();
	}
	
	void deserizable(String filename) throws FileNotFoundException{
		XMLDecoder decoder = new XMLDecoder(new FileInputStream(filename));
		String string = (String)decoder.readObject();
		Date date = (Date)decoder.readObject();
		System.out.println(string);
		System.out.println(date);
		decoder.close();
	}
}
 

SebiB90

Top Contributor
danke
das speichern funktioniert schon nur beim auslesen bekomm ich eine fehlermeldung
Code:
java.lang.ArrayIndexOutOfBoundsException: 1
	at java.beans.ObjectHandler.dequeueResult(XMLDecoder.java:272)
	at java.beans.XMLDecoder.readObject(XMLDecoder.java:150)
	at organizer.PersonenManager.loadPersonenFromFile(PersonenManager.java:48)
	at Starter.main(Starter.java:8)
Exception in thread "main"

zeile 48 ist die in der die forschleife anfängt
Code:
      XMLDecoder decoder = new XMLDecoder(new FileInputStream(daten));
      for(Person p;(p=(Person)decoder.readObject())!=null;) {
        this.addPerson(p);
      }
      decoder.close();
 

foobar

Top Contributor
Code:
XMLDecoder decoder = new XMLDecoder(new FileInputStream(daten));
      for(Person p;(p=(Person)decoder.readObject())!=null;) {
        this.addPerson(p);
      }
      decoder.close();
So kann das auch nichts werden. Du mußt die Personen Objekte in einem Vector ablegen und dann den kompletten Vector serialisieren.

Benutz mal die Suche im Forum, dazu gibt es auch irgendwo ein Beispiel.
 
B

bygones

Gast
warum wird eigentlich der XMLDecoder / Encoder hier verwendet und nicht die einfache serialisierung ???
 

SebiB90

Top Contributor
weil dotlens mir das vorgeschalgen hat.
wenn ich es aber ohne schleife mach funzt es ja

edit:
mit arraylist funktioniert das

edit2:
doch nicht :(
 
M

mr1st

Gast
Mit einfacher Serialisierung könntest Du ja einfach Deine ArrayList oder was auch immer nehmen, in der eben Deine Personen drin stehen, und mit ObjectOutputStream schreiben und mit dem entsprechenden InputStream wieder lesen.

Das funktioniert deshalb, da bei Serialisierung alle Klassen, die eine entsprechende Referenz in der zu speichernden Klasse haben, mitgespeichert werden. So kannst Du wie bereits gesagt mit einem einzigen Befehl die gesamte ArrayList und deren Inhalt speichern. Voraussetzung ist, dass alle zu speichernden Klassen das Interface Serializable von java.io.* implementieren.

MfG

PS: Alle Angaben ohne Gewähr.
 

SebiB90

Top Contributor
wieder neues prob
bekomm hier bei ein StackOverflowError
Code:
public void loadPersonenFromFile(File file) {
    this.daten=file;
    try {
      XMLDecoder decoder = new XMLDecoder(new FileInputStream(this.daten));
      ArrayList temp=(ArrayList)decoder.readObject();
      for(Iterator i=temp.iterator();i.hasNext();) {
        Person p=(Person)i.next();
        this.personen.add(p);
      }
      decoder.close();
    }catch(FileNotFoundException e) {
      e.printStackTrace();
    }
  }
aber wieso?
wo wird da zu viel speicher verbraucht?


edit:
hat sich erledigt
 

foobar

Top Contributor
Warum durchläufst du die deserialiserte Arraylist? Du kannst die Arraylist temp direkt personen zuweisen.
 

foobar

Top Contributor
um die listener zu benachrichtigen
Schreib dir im Tablemodel eine Methode setData(List data) mit der du die Daten aktualisieren kannst.

TableModel:
Code:
public void setData(List data)
{
  this.data = data;
  this.fireTableDataChanged();
}
 

Sindbad1983

Top Contributor
So...da bin ich wieder ! :shock:


Code:
	StringTokenizer tok=new StringTokenizer(s,";",false);
		
		
			while(tok.hasMoreElements()){
				Person p=new Person();
				p.setFirstName(tok.nextToken());
				p.setLastName(tok.nextToken());
				p.setYear.parseInt((tok.nextToken()));	//stimmt das so nicht?
				p.setMonth(tok.nextToken());
				p.setDay(tok.nextToken());
				manager.addPerson(p);
			}


hab damit grad irgendwie Probleme! Der StringTokenizer gibt einen String zurück-> d.h. ich muss den String in einen int-Wert umwandeln!->das macht man normalerweise mit parseInt() oder?

denn in der Klasse Date hab ich die Methode setYear() ect.

Code:
	public void setDay(int day){
		this.day=day;
	}

oder stimmt das gar nicht so??
 

SebiB90

Top Contributor
ich versteh es nicht! :cry: ! :cry: ! :cry: !
irgendwie funzt this.fireTableDataChanged(); nicht
ich weiß nicht warum

ich raste gleich aus!!!!!!!!!!!!!!!
so ein scheiß :cry:
 

SebiB90

Top Contributor
@Sindbad1983
so geht das richtig
Code:
p.setYear(Integer.parseInt(tok.nextToken()));
 

SebiB90

Top Contributor
Sindbad1983 hat gesagt.:
stimmt..aber jetzt kennt er die ganze Methode nicht...
obwohl ich ja setYear in Date implementiert hab :-(
du hast ja für das datum eine extra klasse und da ist die methode drin und die class person hat nur eine instance variable und nicht alle methoden also müsstest du eine instance von der class mit dem datum erstellen dort alles setzen und dann mit person.setDate(datum) setzen.
 

foobar

Top Contributor
obwohl ich ja setYear in Date implementiert hab
Es gibt bereits eine Klasse mit dem Namen Date in java.util. Du solltest deine Klasse anders benennen, sonst kann es leicht zu Verwechselungen kommen.

P.S. Ich spreche aus Erfahrung :)
 

SebiB90

Top Contributor
so mein ich das
Code:
while(tok.hasMoreElements()){ 
            Person p=new Person(); 
            p.setFirstName(tok.nextToken()); 
            p.setLastName(tok.nextToken()); 
            DeineDatumClass date=new DeineDatumClass();
            date.setYear.parseInt((tok.nextToken()));   //stimmt das so nicht? 
            date.setMonth(tok.nextToken()); 
            date.setDay(tok.nextToken()); 
            p.setDate(date);
            manager.addPerson(p); 
         }
und die methode setdate in Person class
Code:
public void setDate(DeineDatumClass date) {
this.dieVariableInDerDuDasDatumSpeicherst=date;
}
 

Sindbad1983

Top Contributor
hast du das Beispiel schon ausprogrammiert?
Ich glaub, ich schaffs nicht! :-(((
Mir fehlt da irgendwie ein bissl der Überblick!
baa, jetzt bin ich wieder voll deprimiert!
 

SebiB90

Top Contributor
gib mal die person class und die class von der datum class

kann mir mal jemand antworten
biiittttteee!!!
 

Sindbad1983

Top Contributor
Code:
class Person{

	private String vorname;
	private String nachname;
	Datum datum;

	
	public void setFirstName(String vorname){
		this.vorname=vorname;
	}
	
	public void setLastName(String nachname){
		this.nachname=nachname;
	}
	
	
	public void setDate(Datum date){
		this.datum=date;
	}
	
	
	

	public void printPerson(){
		String s="";
		s=s+ vorname+nachname;
	}
}
--------------------------------

Code:
class Datum{

	private int year;
	private int month;
	private int day;
	
	public void setDay(int day){
		this.day=day;
	}
	

	public void setMonth(int month){
		this.month=month;
	}


	public void setYear(int year){
		this.year=year;
	}

}
-----------------------------------

Code:
import java.io.*;
import java.util.*;
import java.lang.*;

class TestDate{

	public static void main(String [] args){
		
		PersonManager manager=new PersonManager();
		Person data[] =new Person[200];

		try{

		BufferedReader rb=new BufferedReader(new FileReader("C://Downloads/Geburtstag.txt"));

		String s=rb.readLine();
		
		StringTokenizer tok=new StringTokenizer(s,";",false);
		
		
			while(tok.hasMoreElements()){
				Person p=new Person();
				p.setFirstName(tok.nextToken());
				p.setLastName(tok.nextToken());
				
				Datum date=new Datum();
				date.setYear(Integer.parseInt(tok.nextToken()));
				date.setMonth(Integer.parseInt(tok.nextToken()));
				date.setDay(Integer.parseInt(tok.nextToken()));
				p.setDate(date);
				manager.addPerson(p);
			}
		
		}
		catch(IOException e){};
		
		
	
	}

}
--------------------------------------
Code:
public class PersonManager{

	int personCounter;
	Person [] data;
	Person p;


	public void addPerson(Person p){

		this.data[personCounter++]=p;
	}

	public Person readPerson(){
		return data[p];
	}

}

-------------------------------------------

ich bring da jetzt irgendwie alles durcheinander...weiß nicht, was da jetzt noch fehlt!
Danke!
 

SebiB90

Top Contributor
was hast du für probleme?
was für ein fehler

die "fehler" bzw. anmerkungen hab ich zu deinem code
Code:
public Person readPerson(){ 
      return data[p]; 
   }
wieso wird hier als index ein object/instance von der Klasse Person angegeben?
das muss ein int sein und außerdem wird das array nicht initalisiert oder wie das heißt. also im konstructor das hier rein packen(die zahl anpassen wie du willst)
Code:
this.data=new Person[20];

noch was anderes:
Code:
public void printPerson(){ 
      String s=""; 
      s=s+ vorname+nachname; 
   }
wieso machst du überhaupt nicht das sofort so?
Code:
public void printPerson(){ 
      String s=vorname+nachname; 
   }
und wieso heißt das printPerson? da wird ja nix ausgegeben. einfach per print aus geben oder per return string

Code:
public static void main(String [] args){ 
       
      PersonManager manager=new PersonManager(); 
      Person data[] =new Person[200]; 
//...
das mit dem array muss in den manager rein(siehe oben)

und außerdem würd ich noch wenn es sets methoden gibt auch gets methoden einbauen
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben