Classe abstraite, lister objets

Fermé
Chrome01 Messages postés 4 Date d'inscription dimanche 21 février 2016 Statut Membre Dernière intervention 23 février 2016 - 21 févr. 2016 à 16:14
Chrome01 Messages postés 4 Date d'inscription dimanche 21 février 2016 Statut Membre Dernière intervention 23 février 2016 - 23 févr. 2016 à 22:28
Bonjour,

Tout d'abord voici mon UML représentant mes classes :


Je suis débutant en java et j'aimerai mettre en place un système avec des profs et élèves.
Je mets donc ma classe Personne en abstraite et fais hériter Etudiant et Prof de Personne.

public abstract class Personne {
	
	private String nom;
	private String prenom;
	private static final List<Personne> tableau = new ArrayList<Personne>();
	
	
	public Personne(final String nom, final String prenom) {
		this.nom = nom;
		this.prenom = prenom;
	}

	
	
	public String getNom() {
		return nom;
	}



	public void setNom(String nom) {
		this.nom = nom;
	}



	public String getPrenom() {
		return prenom;
	}



	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public void add()
	{
		tableau.add(this);
	}
	
	public List<Personne> getTableau()
	{
		return tableau;
	}
	
	public List<Personne> getPersonne(String str)
	{
		List<Personne> marque = new ArrayList<Personne>();
		
		for(Personne x : tableau)
		{
			if(x.getPrenom().equals(str))
			{
				marque.add(x);
			}
		}
		
		return marque;
	}	


Voici mon main :
public static void main(String[] args) {
		Etudiant e = new Etudiant("Test","Eleve", 10);
		Prof p = new Prof("Test","Prof");
		
		e.add();
		p.add();
		
		System.out.println(e.getTableau());
		
		System.out.println(e.getPersonne("Prof"));
	 


Je peux créer une liste regroupant des étudiants et des profs mais je suis obligé de passer par soit un étudiant soit un prof pour retourner cette liste.
Ce n'est pas très logique quand on y pense.

J'aimerai donc savoir comment faire une liste regroupant des Personne sans passer par la classe abstraite ? C'est aussi valable pour chercher si une Personne est dans la liste. Est-ce que je dois créer une classe spécialement pour pouvoir gérer cela ?

Merci :)

3 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 févr. 2016 à 16:19
Bonjour,

Ton tableau est static, tu devrais donc utiliser une méthode static pour y accéder. Par exemple :

public static List<Personne> getTableau() {
    return tableau;
}

System.out.println(Personne.getTableau());
0
Chrome01 Messages postés 4 Date d'inscription dimanche 21 février 2016 Statut Membre Dernière intervention 23 février 2016
21 févr. 2016 à 21:24
Bonsoir,

Merci de ta réponse en effet cela a marché comme je le voulais.

Néanmoins maintenant j'ai voulu stocker tous mes objets dans un fichier csv sur lequel je pourrai écrire mes objets mais aussi les lire.

J'arrive bien à écrire et lire mais le problème est qu'à chaque écriture, le fichier est écrasé et je ne parviens pas à ajouter à la suite de mon fichier ...

public class Vehicule_Liste {
	
	
	public static void main(String[] args) {
		
		ObjectInputStream ois;
		ObjectOutput oos;
		List<Vehicule> tab = new ArrayList<Vehicule>();
		try
		{
			oos = new ObjectOutputStream(
					new BufferedOutputStream(
							new FileOutputStream(
									new File("vehicule.csv")),1));
			
			oos.writeObject(new Auto("Audi", "A1"));
			oos.writeObject(new Auto("Audi", "A2"));
		
			
			/*tab.add(new Auto("Audi", "A1"));
			tab.add(new Auto("Audi", "A2"));
			tab.add(new Moto("Honda", 1000));*/
			
			/** Pour tester si les autres objets restent dans le fichier .csv */
			//tab.add(new Moto("THE TEST", 10000));
			
			/*for(Vehicule v : tab)
			{
				oos.writeObject(v);
			}*/
			
			/*System.out.println("Le tableau 1 est :");
			System.out.println(tab);*/
			
			
			oos.close();
			
			List<Vehicule> tab2 = new ArrayList<Vehicule>();
			
			ois = new ObjectInputStream(
		              new BufferedInputStream(
		                new FileInputStream(
		                  new File("vehicule.csv"))));
			
			try
			{
				System.out.println("Affichage Vehicule :");
				while(true)
				{
					tab2.add(((Vehicule)ois.readObject()));
				}
				
				
			}
			catch(ClassNotFoundException e)
			{
				e.printStackTrace();
			}
			catch(EOFException e)
			{
				ois.close();
			}
			
			System.out.println("\nLe tableau 2 est : ");
			System.out.println(tab2);
			
		}
		catch(FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		
	}
}


Je créé un ObjectOutputFile qui me permet d'écrire mes objets sur le fichier et je passe en paramètre du new FileOutputStream un : ",1" qui aurait dû me permettre d'écrire à la suite.
J'ai lu que ce serait un problème de header mais je ne parviens pas à voir ce que je dois changer.
J'ai même eu une exception : java.io.StreamCorruptedException: invalid stream header

Est-ce tu aurais une idée de comment résoudre ce problème ?

Merci d'avance !
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 févr. 2016 à 21:39
Si tu travailles sur un fichier CSV (format texte) ce n'est pas des ObjectStream (format binaire) que tu devrais utiliser mais plutôt FileWriter/Scanner.

String fileName = "C:/test.csv";
boolean append = true;
try (Writer writer = new FileWriter(fileName, append)) {
    writer.append("text;text\n");
}
0
Chrome01 Messages postés 4 Date d'inscription dimanche 21 février 2016 Statut Membre Dernière intervention 23 février 2016
21 févr. 2016 à 22:00
Donc si je veux utiliser cette les ObjectStream, je dois rester sur un fichier .txt ? Est-ce que tu aurais la solution pour régler le problème en admettant que j'utilise un fichier txt ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
21 févr. 2016 à 22:29
Avec un ObjectStream (format binaire) ton fichier sera illisible avec un éditeur de texte, donc l'extension .txt n'est pas adapté. En Java on utiliserait plutôt l'extension .ser car ce que tu manipules ce sont des objets sérialisés...

Mais avec des fichiers textes tu peux utiliser la combinaison FileWriter/Scanner comme je te l'ai proposé plus haut. Exemple :

String fileName = "C:/vehicule.csv";
System.out.println(fileName);

List<Vehicule> list = Arrays.asList(new Auto("Audi", "A8"), new Auto("Audi", "A7"));
try (Writer writer = new FileWriter(fileName, true)) {
    for (Vehicule v : list)
        writer.append(v.getText1()).append(";").append(v.getText2()).append("\n");
}
System.out.println(list);

List<Vehicule> list2 = new ArrayList<Vehicule>();
try (Scanner reader = new Scanner(new File(fileName))) {
    while (reader.hasNextLine()) {
        String line = reader.nextLine();
        String[] text = line.split(";");
        String text1 = text[0]; // text.length > 0 ? text[0] : "";
        String text2 = text.length > 1 ? text[1] : "";
        list2.add(new Vehicule(text1, text2));
    }
}
System.out.println(list2);

Remarque : je ne sais pas comment sont fait tes objets, j'ai mis text1 et text2 pour les valeurs "Audi" et "A1" que tu as mis dans ton code...
0
Chrome01 Messages postés 4 Date d'inscription dimanche 21 février 2016 Statut Membre Dernière intervention 23 février 2016
23 févr. 2016 à 22:28
Bonsoir KX,

Je comprends le code que tu m'as proposé avec la solution FileWrite et Scanner je vais donc la mettre en place. J'avais lu plein de choses sur internet et je trouvais compliqué de mettre les ";" et gérer tout ça ... C'est pourquoi je mettais rabattu sur du ObjectStream mais avec ton code y a aucun soucis c'est super clair !

J'essaye ça et je te fais un retour

Merci !
0