Programmation en java POO [Fermé]

Signaler
-
Messages postés
623
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
11 novembre 2012
-
Bonjour, tt ls mds!!! est vous pouvez m'aider d progammer en java POO d trié un nombre par ordre décroissant



1 réponse

Messages postés
623
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
11 novembre 2012
967
Salut!

Tu dois utiliser un Comparator et implémenter la méthode compare(Object, Object).

Si tous tes objets à trier sont des sous-classes d'une même superclasse, alors, je te conseille de typer ton comparateur afin d'être certain, dès l'appel de la méthode "compare(Object,Object)" de comparer deux objets du même type. Cela t'évitera des "if(object1 instanceof MaClass)...".

Voici un exemple. Imaginons que tu aies:
- une classe Employee
- plusieurs sous-classes de Employee (Comptable, Secrétaire et Informaticien)
Et imaginons que tu désires les trier par ordre décroissant de revenus bruts.

Classe "Employee":
package hacktrack.sortnumber;

public abstract class Employee {

	protected Double salaireBrut;

	public Double getSalaireBrut() {
		return salaireBrut;
	}

	public void setSalaireBrut(Double salaireBrut) {
		this.salaireBrut = salaireBrut;
	}
	
	
}


Sous-classe "Informaticien":
package hacktrack.sortnumber;

public class Informaticien extends Employee{

}


Sous-classe "Secretaire ":
package hacktrack.sortnumber;

public class Secretaire extends Employee {

}


Sous-classe "Comptable ":
package hacktrack.sortnumber;

public class Comptable extends Employee {

}


Et enfin, la classe qui implémente "Comparator":
package hacktrack.sortnumber;

import java.util.Comparator;


public class EmployeeComparator implements Comparator<Employee> {

	@Override
	public int compare(Employee employe_A, Employee employe_B) {
		
		if(employe_A==null){//Si l'employé A==null...
			if(employe_B==null)//... et que l'employé B est null aussi...
				return 0;//...alors ils sont égaux (0 => les deux employés sont égaux)
			return 1;//... mais si l'employé B n'est pas null alors il est 'plus grand' que l'employé A (nombre positif => le second argument est plus grand que le premier)
		}
		
		//Ici, nous savons que l'employé A n'est pas égal à null
		if(employe_B==null)///
			return -1;
		
		
		return employe_A.getSalaireBrut().compareTo(employe_B.getSalaireBrut());
		
	}

}


Et une classe "Main" pour tester:

package hacktrack.sortnumber;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ComparatorDemo {

	public static void main(String[] args) {
		List<Employee> employees = new ArrayList<Employee>();

		Employee informaticien_1 = new Informaticien();
		informaticien_1.setSalaireBrut(new Double(3800));
		employees.add(informaticien_1);

		Employee informaticien_2 = new Informaticien();
		informaticien_2.setSalaireBrut(new Double(3925));
		employees.add(informaticien_2);

		Employee comptable = new Comptable();
		comptable.setSalaireBrut(new Double(3600));
		employees.add(comptable);

		Employee secretaire_1 = new Secretaire();
		secretaire_1.setSalaireBrut(new Double(2950));
		employees.add(secretaire_1);

		Employee secretaire_2 = new Secretaire();
		secretaire_2.setSalaireBrut(new Double(2875));
		employees.add(secretaire_2);

		Collections.sort(employees, new EmployeeComparator());
		for (Employee employee : employees) {
			System.out.println(employee.getClass().getSimpleName()+": "+employee.getSalaireBrut());
		}
	}

}



La classe Collections possède une méthode statique "sort' qui prend en arguments une liste d'objets à trier et un comparateur.

Une fois que tu as invoqué cette méthode, ta liste est triée selon les critères spécifiés dans ton Comparator.

Un exercice pour toi: ajoute un champ "nom" dans la classe Employee (avec getNom() et setNom()).

Et ajoute un critère de tri sur le nom: si deux personnes ont le même salaire brut alors, trier en plus sur le nom (dans l'ordre alphabétique).


Bon amusement!

;-)
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76560 internautes nous ont dit merci ce mois-ci

Messages postés
15893
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
5 juin 2020
2 621
C'est un peu compliqué juste pour trier des nombres, non ?

public class Test 
{    
    public static void main(String...args)
    {
        Integer[] tab = {1, 4, 7, 2, 5, 8, 3, 6, 9};
        
        java.util.Arrays.sort(tab,new java.util.Comparator<Integer>()
        {
            public int compare(Integer n1, Integer n2) 
            {
                return n2-n1;
            }
        });
        
        for (Integer n : tab)
            System.out.println(n);
    }
}
Messages postés
623
Date d'inscription
vendredi 26 juillet 2002
Statut
Membre
Dernière intervention
11 novembre 2012
967
Salut KX!

C'est vrai que ça peut paraître un peu compliqué...

J'ai d'abord voulu donner une réponse dans ton style puis, relisant la question de tadman, j'ai noté qu'il demandait:

"[...]progammer en java POO d trié un nombre par ordre décroissant ".

Pour moi, OO veut dire objet. S'il voulait juste trier des nombres entiers, un Bubblesort aurait suffit ou un algorithme de décalage binaire (qui aurait l'avantage d'être plus rapide).

L'exemple que j'ai donné permet d'aborder:
- la méthode Object.compareTo(Object)
- la méthode Comparator.compare(Object, Object)
- la méthode statique Collections.sort(List)

Le but est que tadman ait un aperçu des méthodes utiles dans le cadre d'une comparaison et/ou d'un tri (d'objets).

CQFD

;-)