Utiliser un comparator uniquement si on l'appelle

Résolu
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 - 5 juin 2011 à 22:32
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 - 6 juin 2011 à 23:44
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

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
6 juin 2011 à 13:48
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
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
6 juin 2011 à 13:48
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);
     }
}
3
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
6 juin 2011 à 18:40
;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)
3
cs_GodConan Messages postés 2113 Date d'inscription samedi 8 novembre 2003 Statut Contributeur Dernière intervention 6 octobre 2012 12
6 juin 2011 à 02:09
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
6 juin 2011 à 07:02
Bonjour,

La treemap est un arbre de recherche binaire.

Quand tu vas inserrer dedans, ou chercher une valeur, tu auras log(n) comparaisons.
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
6 juin 2011 à 10:47
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
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
6 juin 2011 à 10:52
non mais ... tu veux trier ? tu veux chercher des éléments dans un ensemble ? tu veux faire quoi exactement avec ta structure ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
6 juin 2011 à 10:52
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
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
6 juin 2011 à 12:44
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.
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
6 juin 2011 à 12:46
Je précise que le tri c'est juste pour un "simple" affichage.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
6 juin 2011 à 13:50
(coucou747 dis en gros la même chose que moi mais avec un tableau)
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
6 juin 2011 à 14:39
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...
0
cs_romain117 Messages postés 53 Date d'inscription lundi 29 juin 2009 Statut Membre Dernière intervention 21 juillet 2013 1
6 juin 2011 à 23:44
Ok merci.
J'ai testé ma méthode, ça marche, mais au niveau efficacité... bref.

Résolu !
Merci à vous.
0
Rejoignez-nous