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 :

Problème avec Vector.contains


Sujet :

Android

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Problème avec Vector.contains
    Bonsoir à toutes et à tous,

    Je cherche à savoir si un élément d'un Vector contient une valeur. Pas de problème avec de types à une seule composante.

    Je reviens avec mon enfilade de classes :

    J'ai les classes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class TZoom {
        int Zoom;
        Vector<TLatLon> LatLon = new Vector<TLatLon>();
    }
     
    public class TLatLon {
        int Lon;
        Vector<TLatitude> Lat = new Vector<TLatitude>();
    }
     
    public class TLatitude {
        int Lat;
        int IndCarte;
    }
    J'ai créé une instance de la classe TZoom

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	public static Vector<TZoom> lstZoom = new Vector<TZoom>(); // Liste des différents niveaux de zoom
    Avant d'ajouter un élément à mon vecteur, je voudrais savoir s'il ne le contient pas. Mon idée est d'utiliser la méthode "contains", mais ce que je fais ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    TZoom tempZoom = new TZoom();
                    tempZoom.Zoom = nivZ;
                     if (!MainActivity.lstZoom.contains(tempZoom)) {
                        MainActivity.lstZoom.add(tempZoom);
    Dans un premier temps, je souhaiterais que le test ne se fasse que sur la composante Zoom de tempZoom. Comment faire ? "contains" ou autre chose ?

    Maintenant si je veux faire le test sur les deux composants sachant que la deuxième est un Vector, est-ce possible ?

    NOTA : je ne vois pas pour l'instant comment ajouter un élément au vecteur contenu dans mon TZoom, je vais regarder, mais ça fera certainement l'objet d'une future question.

    Cordialement.

    Pierre.

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Quand tu fais un appel à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainActivity.lstZoom.contains(tempZoom);
    Ce qui se passe en interne c'est que java va regarder si l'objet tempZoom est égal à un des objets dans le vecteur. Pour se faire il existe une méthode equals(Object o) disponible sur tous les objets en java.
    Donc si on voulais reproduire la fonction contains on aurait quelque chose comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(Object o : lstZoom) {
        if(o.equals(tempZoom) {
            return true;
        }
    }
    return false;
    Sauf que , par défaut la méthode equals(Object o) retourne true seulement si les 2 références pointent vers la même case mémoire (la même instance).
    C'est logique car JAVA n'est pas capable de déterminer à ta place ce qui constitue une condition d'égalité au sein de ton objet.

    Pour valider que deux objets sont égaux il va donc falloir que tu surcharges la méthode equals avec ta propre implémentation.
    Si je prend l'exemple de ta classe TLatitude ca donnerait :

    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
    18
    19
    20
    21
    22
    23
    class TLatitude {
        int Lat;
        int IndCarte;
     
        @Override
        public boolean equals(Object o) {
     
            // Si pas le bon type d'objet forcément false
            if (!(o instanceof TLatitude)) { 
                return false; 
            } 
            // Si l'objet est lui même , forcément true
            if (o == this) { 
                return true; 
            } 
     
            // On cast l'objet pour pouvoir utiliser les membre
            TLatitude tLatitude = (TLatitude) o;
     
            // Finalement la logique permettant de décider si 2 objets sont identique  
            return Lat == tLatitude.Lat && IndCarte == tLatitude.IndCarte;
        }
    }
    Note que Android Studio peux faire une bonne partie du travail pour toi , dans la classe tu fais le raccourcis alt+inser et tu choisis l'option "equals() and hashCode()" et ca va te générer les méthodes en fonctions de test choix.

    Tu vas vite te rendre compte que la méthode equals() va de concert avec hashcode() , il est fortement recommandé de l'implémenter en même temps. Je te laisse te documenter sur le sujet
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci "grunk" pour cette méthode.

    Dans l'attente d'une réponse, j'avais appliqué cette méthode (ligne 11 ici commentée) alors que le tienne est en ligne 10 ::

    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
    18
    19
       public static void nivZoom(File[] fchCarte) {
            for (int i = 0; i < fchCarte.length; i++) { // Toutes les cartes
                File[] nbZoom = FCH.listeRep(fchCarte[i]); // Liste des niveaux de zoom dans un répertoire de cartes
                for (int j = 0; j < nbZoom.length; j++) { // Passage en revue des différents zoom dans une carte
                    int nivZ = Integer.parseInt(nbZoom[j].getName()); // N° du zoom
                    TZoom tempZoom = new TZoom(); // Instance temporaire d'un N° de zoom
                    tempZoom.Zoom = nivZ;
                    boolean vu = false;
                    for (int k = 0; k < MainActivity.lstZoom.size(); k++) { // On enregistre les zoom dans un Vector ... 
                        if (MainActivity.lstZoom.elementAt(k).equals(tempZoom)) { // ... s'il n'y est pas déjà
    //                    if (MainActivity.lstZoom.get(k).Zoom == nivZ) {
                            vu = true;
                            break;
                        }
                    }
                    if ( MainActivity.lstZoom.size() == 0 || vu == false)
                        MainActivity.lstZoom.add(tempZoom);
                 }
            }
    Ma méthode, quoique moins élégante n'est-elle pas plus rapide car pas d'appel de fonction ?

    Ce n'est pas important ici car je n'ai que quatre niveaux de zoom, mais j’utiliserai cette méthode pour des fichiers de latitudes qui peuvent être plusieurs dizaines de milliers.

    Cordialement.

    Pierre

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Ma méthode, quoique moins élégante n'est-elle pas plus rapide car pas d'appel de fonction ?
    J'aurais tendance à dire que les fonctions "natives" sont plus rapide car optimisée , mais je ne sais pas ce que fait le compilateur en arrière plan donc j'ai pas de réponse à t'apporter.

    Il existe aussi des structures de données comme les HashSet qui n'accepte pas 2x le même élément (add() retournera false) ca peut être quelque chose d'intéressant dans ton cas.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Problème avec vector de classe template :(
    Par coyotte507 dans le forum Langage
    Réponses: 7
    Dernier message: 16/04/2008, 12h40
  2. Réponses: 2
    Dernier message: 07/12/2007, 02h19
  3. Problème avec vector<char>
    Par Fahmi06 dans le forum C++
    Réponses: 6
    Dernier message: 13/08/2007, 17h10
  4. Problème avec Vector et Iterator
    Par boudincweole10 dans le forum Langage
    Réponses: 1
    Dernier message: 08/04/2007, 07h26
  5. Problème avec vector par référence
    Par vdumont dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/05/2006, 08h25

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