Utiliser un comparator uniquement si on l'appelle [Résolu]

Signaler
Messages postés
53
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
21 juillet 2013
-
Messages postés
53
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
21 juillet 2013
-
Bonsoir,

J'ai une variable de type treemap que je trie avec un comparator.

class MaClasse
{
    //ascending order for the treemap
    Comparator<String> ascendingComparator = new Comparator<String>() 
    {
        //@Override 
        public int compare(String s1, String s2) 
        {
    	   ...	
        }           
    };
    
    SortedMap<String, Integer> myMap = new TreeMap<String,Integer>(ascendingComparator);


...
}

De cette manière ma variable est automatiquement triée. Ce que je voudrais c'est ne la trier que sur appel de la fonction compare. Je voudrais pouvoir dire à mon treemap : "ne te trie que si je fais myMap.compare() ". Est-ce possible ?

Merci d'avance,

Romain

13 réponses

Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
35
Si tu ne fais pas d'algos dessus : si tu veux juste trier pour afficher, alors le plus simple (et rapide) c'est de tout mettre dans un tableau et de trier avec Arrays.sort
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
293
En général, l'utilisation de treemap n'est utile que si on a besoin d'accéder rapidement aux informations et qu'il y a un très grand nombre d'enregistrements.

Dans ton cas, tu ne fais pas de recherche sur la table, pour un simple affichage, tu peux te passer de treemap, utiliser une arrayList et implémenter Comparable :
//Truc est ton String "1 2 4" ou "5"
public class Truc implements Comparable<Truc> {
     private String valeur;
     
     public Truc(String val){
          valeur=val;
     }

     /**
       * CompareTo retourne si truc=this et autre chose que 0 sinon
       */
     public int compareTo(Truc truc){
          int res=0;
          //La tu fais ton traitement
          return res;
     }
}


Une idée pour faire la comparaison serait de supprimer les espaces et de parser le String en int puis de faire la soustraction.

Ensuite, tu créé une liste

public class ListeTruc extends ArrayList<Truc>{
     public void trier(){
          //Le tri est fait automatiquement etant donne que tu as définit compareTo dans Truc
          Collections.sort(this);
     }
}
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
10
;o) tu vas obtenir une usine a gaz... ;o) ...si ta collection devient un peu grossse ;o) tu va bouffer de plus en plus de ressources... surtout si il te faut conserver l état enterrieur ;o) ...

les arraylist et la methde sort (comme deja dit) me semble bien adapter à tes besoins

GodConan ;o)
Messages postés
2116
Date d'inscription
samedi 8 novembre 2003
Statut
Contributeur
Dernière intervention
6 octobre 2012
10
salut,
c est justement l interret des compartor ;o) : d'automatiser les comportement ;o) ... tu peu ne pas utiliser de sorter ;o) ... ;o) sinon y a plsuieurs solution ;o) : tu changes de comparator à la demande (pas sur que ca se fasse bien)
tu peux aussi modifier le comportement de ton comparator en fonction d'un trigger...
le soucis avec le changement du comparator c est qu il faut aussi t assurer que ton treemap prend bien la modif pour faire la MAJ des données (désolé connai pas cette class suffismeent pour le predire)
et tu peux aussi faire à l ancienne ;o) toi meme le trie ;o) ... sans utiliser de comparator ;o) ...

GodConan ;o)
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
35
Bonjour,

La treemap est un arbre de recherche binaire.

Quand tu vas inserrer dedans, ou chercher une valeur, tu auras log(n) comparaisons.
Messages postés
53
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
21 juillet 2013

Rebonjour,

Alors si je comprends bien, il vaut mieux que je fasse une fonction de tri classique. Il me semble qu'il en existe plusieurs, mais le problème c'est que ça ne pourra jamais être aussi rapide qu'une recherche via un comparator. Je me trompe ?

Voici ma fonction compare qui permet de comparer des entiers à la base considérés comme une chaîne de caractères.

        @Override 
        public int compare(String s1, String s2) 
        {
    		int tempInt1, tempInt2;
    		
    		s1=s1.replaceAll("\\s+","");
    		s2=s2.replaceAll("\\s+","");
    		tempInt1=Integer.parseInt(s1);
    		tempInt2=Integer.parseInt(s2);
    		
    		
    		if (tempInt1<tempInt2)
    		{
    			return 1;
    		}
    		else if(tempInt1>tempInt2)
    		{
    			return -1;
    		}
    		else
    		{
    			return 0;
    		}

        }  


Quelle est selon vous la méthode la plus efficace pour transcrire ça via une fonction de tri ?

Romain
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
35
non mais ... tu veux trier ? tu veux chercher des éléments dans un ensemble ? tu veux faire quoi exactement avec ta structure ?
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
293
L'utilisation du comparator a pour but d'accélérer la recherche. Pour que la recherche soit rapide, ton arbre est constamment trié donc :

- Tu ne peux pas ne pas trier ton arbre
- Si tu utilises un autre moyen, la recherche sera plus lente
Messages postés
53
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
21 juillet 2013

Ok c'est bien ce que je pensais, un autre moyen sera moins rapide. Tant pis, je prendrai quand même cet autre moyen ! Si je ne peux pas trier mon arbre, comment faire ? Utiliser une autre structure, qui garderait à la fois clés et valeurs ?

En fait les clés de mon treemap, triées automatiquement mais mal, contiennent des strings du genre "1", "3 1 2", "4", "2 3 4"... Je voudrais trier comme ceci : "1", "4", "2 3 4", "3 1 2".
Je cherche à les classer comme s'il s'agissait d'entiers, je cherche bien sûr à classer l'ensemble du treemap.
Messages postés
53
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
21 juillet 2013

Je précise que le tri c'est juste pour un "simple" affichage.
Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
293
(coucou747 dis en gros la même chose que moi mais avec un tableau)
Messages postés
53
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
21 juillet 2013

Oui je pense que vos deux solutions se valent, et je vais sans doute en adopter une des deux .
Mais j'y pense...
Imaginons que je copie mon treemap (ou hashtable) à classer dans un nouveau treemap qui utilise la fonction compare dont je parlais (avec un putAll je crois). Il me semble que ça devrait marcher . Je vais tester...
Messages postés
53
Date d'inscription
lundi 29 juin 2009
Statut
Membre
Dernière intervention
21 juillet 2013

Ok merci.
J'ai testé ma méthode, ça marche, mais au niveau efficacité... bref.

Résolu !
Merci à vous.