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

AWT/Swing Java Discussion :

Aide Collections binarySearch


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2016
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2016
    Messages : 95
    Points : 56
    Points
    56
    Par défaut Aide Collections binarySearch
    Bonjour,

    j'aurais besoin de votre aide car il y a une chose que je ne comprends pas. En effet, j'ai créé une interface graphique dans laquelle se trouve un JtextArea. J'essaye actuellement de mettre en oeuvre une fonction d'auto-complétion pour faciliter la saisie aux utilisateurs.

    Pour cela, j'ai créé une classe appelée AutoCompletion dans laquelle se trouve une liste qui correspond au dictionnaire de mots qui seront reconnu par la fonction de complétion. :

    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
    24
    25
     
    public class AutoCompletion implements DocumentListener {
            /**
             * Paramètres
             */
    	private JTextArea EqArea;
    	private List<String> dictionnary;  
     
    	/**
             * Getter & Setter
             */
    	public List<String> getDictionnary() {
    		return dictionnary;
    	}
    	public void setDictionnary(ArrayList<String> dictionnary) {
    		this.dictionnary = dictionnary;
    	}
     
    	/**
             * Constructeur par defaut
             */
    	public AutoCompletion(JTextArea EqArea){
    		this.EqArea=EqArea;
                     EqArea.getDocument().addDocumentListener(this);
    	}
    La liste de completion comprend une longue liste de mots. Pour réaliser la complétion, j'utilise la methode insertUpdate :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    /**
             * Evenement declenché quand l'utilisateur ecrit dans le JTextArea
             * @param e
             */
    	@Override
    	public void insertUpdate(DocumentEvent e) {
    	// TODO Auto-generated method stub	
    		//On arrête l'execution de l'evenement si l'utilisateur fait un copier/coller
    		if (e.getLength() != 1) {
    			return;
    		}
    		//On recupère la position du dernier caractère saisi en comptant de 0
    		int pos = e.getOffset();
    	    String content = null;
    	    try {
    	    	//on recupère ce qu'a saisi l'utilisateur jusqu'à present
    	    	content = EqArea.getText(0, pos + 1);
    	    	System.out.print("\nCONTENT : "+ content );
    	   }catch (BadLocationException er) {
    		   	er.printStackTrace();
    	   }	
     
            //Find where the word starts
            int w;
            for (w = pos; w >= 0; w--) {
                if (! Character.isLetter(content.charAt(w))) {
                    break;
                }
            }
            if (pos - w < 2) {
                // Too few chars
                return;
            }
    	    String prefix = content.substring(w + 1);
        	System.out.print("\nPREFIX  : "+ prefix );
     
     
    	  //On fait une recherche sur la chaine qu'à saisi l'utilisateur dans les données de l'autocompletion  
    	  //La methode binarySearch retourne : 
    	  //- soit l'index de l'élément cherché s'il est contenu dans la collection
    	  //- soit le nombre d'élement de la collection si tous les elements sont inferieur à l'élément que l'on cherche
    	  //- soit un entier négatif qui représente l'index de permier élément superieur de l'élément qu'on cherche 
    	    //prefix = String.compareToIgnoreCase(prefix);
    	    int index = Collections.binarySearch(dictionnary, prefix);
    	    System.out.printf("\nINDEX   : " + index);
     
     
            if (index < 0 && -index <= dictionnary.size()) {
                String match = dictionnary.get(-index - 1);
    	    	//Completion trouvé --> On recupère le premier element supérieur à la chaine recherché. 
    	    	//Le signe "-" retourne la valeur absolue de la variable index
    		    System.out.printf("\nMATCH   : " + match);
     
    	    }
    	}
    Le programme marche mais le résultat obtenu est erroné.
    En effet, lorsque je fait : Collections.binarySearch(dictionnary, prefix); j'ai à priori un mauvais index.
    Comme le montre le resultat de la console ci-dessous, j'ai le même index pour des prefix différents...


    J'ai donc vraiment besoin de vous pour comprendre l'erreur.
    Merci d'avance...
    Images attachées Images attachées  

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 42
    Points : 52
    Points
    52
    Par défaut
    Relis la spécification de la méthode collections.binarysearch en particulier:

    Returns:
    the index of the search key, if it is contained in the list; otherwise, (-(insertion point) - 1). The insertion point is defined as the point at which the key would be inserted into the list: the index of the first element greater than the key, or list.size() if all elements in the list are less than the specified key. Note that this guarantees that the return value will be >= 0 if and only if the key is found.

Discussions similaires

  1. Problème Collections binarySearch
    Par Aymenkn dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 29/12/2014, 20h21
  2. Réponses: 1
    Dernier message: 22/03/2010, 16h56
  3. [SP-2007] aide pour SD "collect user data"
    Par fbazin dans le forum SharePoint
    Réponses: 0
    Dernier message: 30/08/2009, 15h56
  4. [C#] Aide pour trier une collection
    Par erigoal dans le forum C#
    Réponses: 2
    Dernier message: 31/10/2008, 21h39
  5. NetBeans Eclipse Collections.binarySearch
    Par henriDes dans le forum Langage
    Réponses: 3
    Dernier message: 11/09/2006, 17h02

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