Trier des instances de classe

Fermé
linquisiteur - 5 août 2013 à 22:37
 linquisiteur - 6 août 2013 à 12:16
Bonjour, Je suis en train de créer un programme qui à bout but de permettre d'organiser un concour.

Je me sert de 2 classe en plus du main.

Dans le Main je crée le concour avec x place. Et lors des inscriptions dans le main (pas encore implémenter) j'utiliserai la classe concour pour remplir un tableau de type Participante (seconde classe)

Dans ce programme j'ai 2 problème.

Le 1er, le plus gros est la classe trie dans concour. je voudrais trier directement lors de l'ajout d'un nouveau inscrit de sorte à avoir les participants par ordre alphabétique. Mais je ne sais pas du tout comment implémenter cela. j'ai fait le code mais il est rempli d'erreur...

Le second problème se situe dans la fonction cloner de la classe Participante

J'aimerai cloner cette objet en passant par la procédure Inscrire de la classe concour mais j'ai un problème dans l'unique ligne du code


public class Concour {
	
	private int MaxInscrit;
	private int nbInscrit;
	private Participante[] tab;
	
	public Concour(int nb)
	{
		this.MaxInscrit=nb;	
		this.nbInscrit=0;
		tab = new Participante[MaxInscrit];
	}
	
	public void Inscrire(String nom)
	{
		tab[nbInscrit] = new Participante(nom);
		nbInscrit++;
		Trie(nom);
		Complet();
	}
	
	public void Inscrire(String nom, String ecole)
	{
		tab[nbInscrit] = new Participante(nom,ecole);
		nbInscrit++;
		Trie(nom);
		Complet();
	}
	
	private void Complet()
	{
		if(nbInscrit == MaxInscrit) System.out.println("Concour complet !");
	}
	
	private void Trie(String name)
	{
		int cpt = 0;
		while (cpt<nbInscrit)
		{
			if(tab[cpt].nom.compareTo(name))
			else
			{
				temp = new Participante(tab[cpt].nom);
				tab[cpt].nom = name;
				name = tab[cpt].nom;
				cpt++;
			}
		}
	}
}



class Participante{

	private String nom;
	private String ecole;
	private int scoreAsym;
	private int scorePoutre;
	private int nbJugeAsym;
	private int nbJugePoutre;
	
	
	//constructeur
	public Participante(String nom){
		this.nom = nom;
		this.ecole = "aucune";
		}
	
	public Participante(String nom, String ecole){
		this.nom = nom;
		this.ecole = ecole;
		}
	
	public void noteAsym(int score){
		this.scoreAsym += score;
		this.nbJugeAsym++;
	}
	
	public void notePoutre(int score){
		this.scorePoutre += score;
		this.nbJugePoutre++;
	}
	
	public String getNom()
	{
		return nom;
	}
	
	public float getMoyenneAsym()
	{
		float moy=(scoreAsym/nbJugeAsym)*10;
		return moy;
	}
	
	public float getMoyennePoutre()
	{
		float moy=(scorePoutre/nbJugePoutre)*10;
		return moy;
	}
	
	public float getMoyenneTotal()
	{
		float moy=(getMoyenneTotal()+getMoyennePoutre());
		return moy;
	}
	
	public String toString()
	{
		return "Participante: "+nom+" Ecole: "+ecole+" Score moyen epreuve asymetrique: "+getMoyenneAsym()+" Score moyen epreuve Poutre "+getMoyennePoutre()+"Moyenne globale: "+getMoyenneTotal() ;
	}
	
	//renvoie 1 si this est le gagnant sinon 0
	public int comparerMoyenne(Participante p)
	{
		int winner;
		if(this.getMoyenneTotal() > p.getMoyenneTotal()) winner=1;
		else if (this.getMoyenneTotal() > p.getMoyenneTotal()) winner=0;
		else
		{
			if(nom.length() > p.nom.length()) winner=1;
			else winner=0;
		}
		
		return winner;
	}
	
	public void cloner()
	{
		ch.Inscrire( new Participante(this.nom, this.ecole));
	}
	
	public void ecole(String ecole)
	{
		if(this.ecole == ecole) System.out.println("La participante provient de cette école");
		else System.out.println("La participante provient d'une autre école. A savoir: "+this.ecole);
	}
}

3 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
5 août 2013 à 22:58
Salut,
pour trier les objets sans se casser la tête et pouvoir utiliser les méthodes standard, il faut que la classe implémente l'interface Comparable<>:
class Participante implements Comparable<Participante> {
...
public int compareTo(Participante autreParticipante) {
	return nom.compareTo(autreParticipante.nom);
}	
Le tri devient donc plus que simple, et adieu la fonction Trie(nom), remplacée alors par ceci:
Arrays.sort(tab);
dans les fonctions Inscrire().

Pour le problème de la fonction cloner() -- qui par ailleurs par convention devrait s'appeler clone(), être un @Override de clone() de l'interface Clonable que Participante devrait implémenter, et ne rien faire d'autre que de cloner et renvoyer le clone --, "ch" n'est défini nulle part.
Il faut donc le définir:
Concour ch;
Participante(String nom, Concour ch) {
this.ch = ch;
...



Pour pousser loin un détail va nous géner: Java ne pourra pas libérer la mémoire des objets Concour et les Participantes associés, car il y aura une référence cyclique: le Concour dépend des Participantes, et les Participantes dépendent du Concour; l'utilisation d'une WeakReference<Concour> s'imposera:
WeakReference<Concour> ch;
Participante(String nom, Concour ch) {
this.ch = new WeakReference<Concour>(ch);
...

public void cloner()
{
	if (ch != null && ch.get() != null)
		ch.get().Inscrire( new Participante(this.nom, this.ecole));
}
0
Merci beaucoup de toute ces explication. Ces une question (une seul des question.. ) de mon examen de java de juin. On n'a pas vu l'interface comparable et le weakreference :( Y a t'il une méthode moins optimiser, ou plus tordu qui me laisserai dans le cadre du cour. Pas que je ne veux pas apprendre mais je me vois mal replacer tout cela dans un prochain examen ^^'

encore merci
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
6 août 2013 à 11:32
Pour le WeakReference<T> c'est quelque chose d'assez avancé, bien que simple dans son principe. Oublie-la, je l'ai mis surtout si d'autres personnes qui codent en Java lisent le post.

En revanche je suis étonné que tu n'aies pas vu l'interface Comparable<T>, qui pourtant est plus qu'importante quand on veut faire un tri, et niveau optimisation rapidité et lisibilité y'a pas vraiment mieux.
Car implémenter soi-même un algorithme de tri (en général de complexité O(n log n)) n'est pas toujours une mince affaire; alors autant profiter à fond de ce que Java nous offre.
0
Je viens de modifier cloner et ajouter un constructeur dans concour:

	Concour ch;
	public void cloner()
	{
		ch.Inscrire( new Participante(this.nom, this.ecole));
	}


public void Inscrire(Participante p)
	{
		tab[nbInscrit] = new Participante(nom, ecole);
		nbInscrit++;
		Trie(nom);
		Complet();
	}


Par contre eclipse me signale une erreur pour les 2 paramètre de Inscrire à savoir nom et ecole. Comment je dois faire?
0