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

Collection et Stream Java Discussion :

Recherche dans une ArrayList


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut Recherche dans une ArrayList
    Bonjour à tous,

    J'ai un petit soucis avec une ArrayList<Coordinate>. Je définis la classe Coordinate de la façon suivante :
    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
    public class Coordinate{
     
    	public int x;
    	public int y;
     
    	public Coordinate(int i, int j){
    		x = i;
    		y = j;
    	}
     
    	public Coordinate(Coordinate c){
    		x = c.x;
    		y = c.y;
    	}
     
    }
    J'ai donc une ArrayList<Coordinate> qu'on appelera "alc". Je souhaite pouvoir savoir rapidement si pour deux entier i et j donnés, il existe dans "alc" un élément "c" tel que, c.x = i et c.y = j.

    Je préférerais éviter de parcourir l'ensemble de l'ArrayList pour faire cela (je dois en fait afficher un grand tableau dans une JTable et pour chaque case correspondant à une des coordonnées de l'ArrayList, il y a un traitement spécial). J'ai donc pensé à utiliser la fonction "contains" de la classe ArrayList. Mais comme les références des objets ne sont pas les mêmes mon test me renvoie toujours false :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Coordinate c1 = new Coordinate(1, 1);
    Coordinate c2 = new Coordinate(1, 1);
     
    ArrayList<Coordinate> al = new ArrayList<Coordinate>();
    al.add(c1);
     
    System.out.println(al.contains(c2)); // Affiche "false"
    Auriez-vous une solution à mon problème ? Suis-je obligé de parcourir toutes la liste ?

    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par SAKDOSS Voir le message
    Je préférerais éviter de parcourir l'ensemble de l'ArrayList pour faire cela
    Euh ? Ça va s'arrêter au premier objet correspondant trouvé, bien sûr, ça va pas continuer après... Mais si c'est une ArrayList, il va bien falloir parcourir toute la liste jusqu'à trouver ce qu'on cherche.
    Si tu veux faire une recherche plus rapide, tourne-toi vers les Set ou SortedSet... Qui ne tolèrent pas de doublon et ne te laissent pas définir l'ordre des éléments comme le ferait une List.

    Citation Envoyé par SAKDOSS Voir le message
    Auriez-vous une solution à mon problème ? Suis-je obligé de parcourir toutes la liste ?
    Pour pouvoir utiliser le contains() des collections, il faut que ta classe Coordinate redéfinisse les méthodes equals() et hashCode().
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2010
    Messages : 394
    Par défaut
    Bonjour,

    Question ouverte, est-ce que pour utiliser contains() il peut suffire de faire en sorte que ta classe implémente l'interface Comparable, en définissant toi-même le critère pour que deux éléments soient considérés comme égaux ?

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class Coordinate implements Comparable<Coordinate> {
     
         // Le code de la classe
     
         @Override
         public int compareTo(Coordinate c) {
              // Doit retourner :
              // - une valeur > 0 si this > c
              // - une valeur < 0 si this < c
              // - 0 si this == c
         }
    }
    Mako.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Non je ne le crois pas, la méthode contains est définit ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)).
    On en revient donc à la méthode equals qui elle dépend (si elle n'est pas surchargée) du hashCode.

    Par defaut Comparable n'entre pas en jeu, sauf si on redéfinit une des méthodes au-dessus.

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2009
    Messages
    282
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 282
    Par défaut
    tu peux implementer l'interface comparable ou directement le mettre dans le contsructeur de ton Set (c'est assez propre je trouve comme solution).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Set<Coordinate> set = new TreeSet<Coordinate>(new Comparator<Coordinate>() {
         public int compareTo(Coordinate c1, Coordinate c2) {
              // compare method
         }
    });
    Je crois ca s'écrit comme ca (après j'ai pas vérifié sur l'éditeur)....

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Par défaut
    Merci pour vos réponses.

    @thelvin : Je me suis mal exprimé. La recherche s'arrêtera, effectivement, une fois le Coordinate trouvé dans l'ArrayList. Cependant la plupart des cellules de ma JTable auront des Coordinate ne figurant pas dans l'ArrayList (et donc la plupart du temps toute l'ArrayList sera parcourue). Les set semblent en effet me permettre de gagner du temps.

    @ticroch : Merci pour le code. D'après Eclipse c'est la fonction "compare" qu'il faut implémenter plutôt que "compareTo" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set<Coordinate> set  = new TreeSet<Coordinate>(new Comparator<Coordinate>(){
    	public int compare(Coordinate c1, Coordinate c2){
    		...
    	}
    });

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2009
    Messages
    282
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 282
    Par défaut
    Ouep ba comme je disais j'ai pas d'éditeur, j'ai fait ca de tête. Ces normal que tu gagne du temps, ce sont des ensembles ordonnés avec les TreeSet, donc il parcoure rerement tous le Set pour retrouver l'objet dont tu as besoin.

    Par contre si je me rappelle bien il y a une grosse erreur a faire attention avec ce TreeSet, c'est si tu modifie l'intérieur de tes objets (ici tes coordonnées). Quand tu fais cela, il faut absolument retirer l'objet du Set,le modifierm, et le remettre après, sinon c'est possible que ton Set se retrouve mal ordonné et qu'il te donne ensuite de mauvais résultat en insérant des doublons, voir même en indiquant qu'un élément ne se trouve pas dans ton set alors qu'il s'y trouve. Je vais essayer d'écrire un exemple pour prouver ca, et je le POST.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. rechercher dans une arraylist
    Par Kagami dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 06/06/2015, 17h06
  2. Rechercher dans une ArrayList
    Par Whinze dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 11/01/2013, 14h02
  3. Recherche dans une ArrayList
    Par c-ve dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 10/07/2007, 11h22
  4. Réponses: 4
    Dernier message: 19/06/2007, 10h41
  5. [C#,débutante] recherche dans une arraylist
    Par MissLaLou dans le forum ASP.NET
    Réponses: 5
    Dernier message: 16/05/2007, 08h58

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