IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Hashtable, trie et doublon


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut Hashtable, trie et doublon
    Bonjour.

    J'aimerais utiliser une Hashtable pour trier des object en fonction d'une valeur :

    ex :

    j'ai un objet qui est accolé a la valeur 2, puis un autre la valeur 4, puis un autre valeur 4 encore, puis un 5, puis un 2 etc...

    Le but est d'avoir accès a tous les objets par ordre croissant de cette valeur accolé, tout en gardant les doublons.

    Je procède ainsi, mais le resultat est mauvais puisqu'il semblerait qu'il ne me renvoi qu'une petite partie des objets :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
            Hashtable<Integer, Object> select = new Hashtable<Integer, Object>();
     
            select.put( number , listID.get(cont3));
     
        for (Map.Entry<Integer, Object> entry : select.entrySet()){
            entry.getValue().doJob();
        }
    Or si "number " est croissant, toujours différents, tous les objets sont bien sélectionnés.

    Il y a-t-il une methode particulière pour faire ceci ?

    Merci si vous pouvez m'aider.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    De manière générale, trier par Hashtable est une mauvaise idée.
    Le seul cas ou c'est intéressant, c'est lorsque les clés ont une répartition selon une suite continue (ou sans trop de trous).
    Un tri par Hashtable se déroule en deux étapes :
    1. insérer les couples clé/valeur
    2. prendre la valeur de clé la plus basse puis incrémenter la clé en vérifiant son existence dans la table


    Ce qui peut devenir extrêmement couteux, c'est le parcours des clés.

    Ton code ne peux pas fonctionner puisque tu parcours les entrées de la table qui n'ont aucune notion d'ordre. Donc ta boucle for parcourt les données de la table dans le désordre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Par défaut
    Ok, merci, Dinobogan.

    Connais tu par hasard un conteneur approprié a mon cas ?

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu peux utiliser une TreeMap par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TreeMap<Integer, List<Object>> map = new TreeMap<>();
    Pour écrire tes valeurs, tu peux procéder à l'ancienne (Java 7 et précédent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void ajouterObject(int cle, Object object) {
           List<Object> list = map.get(cle);
           if ( list==null ) {
                list = new ArrayList<>();
                map.put(cle, list);
           }
           list.add(object);
    }
    ou en Java 8 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ajouterObject(int cle, Object object) {
     
            map.compute(cle, Utils.toListMappingFunction(object));
     
    }
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public class Utils {
            public static <K, T> BiFunction<K,List<T>,List<T>> toListMappingFunction(T t) {
    		return toListMappingFunction(t, ()-> new ArrayList<>());
    	}
     
    	public static <K, T> BiFunction<K,List<T>,List<T>> toListMappingFunction(T t, Supplier<List<T>> supplier) {
    		return new BiFunction<K, List<T>, List<T>>() {
    			public List<T> apply(K k, List<T> v) {
    				if ( v==null ) {
    					v = supplier.get();
    				}
    				v.add(t);
    				return v;
    			}
    		};
    	}
    }
    Pour le parcourt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(Map.Entry<Integer, List<Object>> entry : map.entrySet()) {
                  System.out.println("Clé : " + entry.getKey());
          for(Object object : entry.getValue()) {
     
                  System.out.println("      Valeur : " + object;
     
          }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par mazertys17 Voir le message

    j'ai un objet qui est accolé a la valeur 2, puis un autre la valeur 4, puis un autre valeur 4 encore, puis un 5, puis un 2 etc...

    Le but est d'avoir accès a tous les objets par ordre croissant de cette valeur accolé, tout en gardant les doublons.


    Il y a-t-il une methode particulière pour faire ceci ?

    Merci si vous pouvez m'aider.
    Le plus simple ca reste de créer un objet dédié à ton tri, tout simplement


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class WeightedObject<T> implements Comparable<WeightedObject<T>>{7
       private Integer value;
       private T object;
       public WeightedObject (T object, int value){
          this.object = object;
          this.value = value;
       }
      public int compareTo(WeightedObject<T>  other){
          return value.compareTo(other.value);
      }
       // + getters & setters
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<WeightedObject<TonType>> taListe = ...
    taListe.add(new WeightedObject<TonType>(x,1));
    taListe.add(new WeightedObject<TonType>(y,4));
    taListe.add(new WeightedObject<TonType>(z,1));
    Collections.sort(taListe);
    for (WeightedObject<TonType> w: taListe){
        w.getObject().doJob();
    }

  6. #6
    Membre Expert
    Avatar de MathiasSeguy
    Homme Profil pro
    Fondateur Android2EE - Formation Expertise Android
    Inscrit en
    Avril 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fondateur Android2EE - Formation Expertise Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 185
    Billets dans le blog
    6
    Par défaut
    Sur Android, on préconise l'utilisation des sparseArray dès que la clef est de type primitif (int, double,...). Il existe un sparseArray spécifique par use case. C'est ce que tu devrais utiliser si tu fais de l'Android.

Discussions similaires

  1. [XL-2000] Liste Triée sans doublon
    Par cobra38 dans le forum Excel
    Réponses: 4
    Dernier message: 07/07/2010, 23h13
  2. Réponses: 5
    Dernier message: 05/11/2008, 23h23
  3. [VBA-E]trie(suppression de doublons) dans une feuille excel
    Par TANIE dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/08/2006, 13h25
  4. trie doublons
    Par phil22 dans le forum Requêtes
    Réponses: 11
    Dernier message: 15/11/2005, 15h14
  5. doublon et trie sur autre colonne
    Par Force59 dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/04/2004, 09h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo