2010-04-26 6 views
0

Problème:problème avec underscore (_) dans Collections.binarySearch (Java)

J'utilise Java Tutorials™ sourcecode pour cela. Ceci est le source code.

J'ai essayé ceci:

--following with another section of sorted words-- 
words.add("count"); 
words.add("cvs"); 
words.add("dce"); 
words.add("depth"); 
--following with another section of sorted words-- 

et il fonctionne parfaitement. Cependant, lorsque j'utilise ceci:

--just a section of sorted words-- 
words.add("count"); 
words.add("cvs"); 
words.add("dce_iface"); 
words.add("dce_opnum"); 
words.add("dce_stub_data"); 
words.add("depth"); 
--following with another section of sorted words-- 

Il ne montre dce_iface quand je tape dce, mais quand je tape _ puis en suivant avec o ou s il me montre quelque chose d'autre comme dce_offset où le décalage provient de words.add("fragoffset"); quelque part dans la liste .

Que puis-je faire pour résoudre ce problème? Merci d'avance.

Répondre

1

Il est probablement à cause de ces lignes dans le code:

for (w = pos; w >= 0; w--) { 
    if (! Character.isLetter(content.charAt(w))) { 
     break; 
    } 
} 

_ est pas un caractère de lettre, il traite de la même façon comme un espace. Vous pouvez essayer de changer la condition de:

char c = content.charAt(w); 
if (! (Character.isLetter(c) || c == '_')) { 
+0

OT - Hmm bizarrement, mon Chrome n'affichait pas le textarea pour le commentaire d'ajout. M'a rendu perplexe pendant un moment. @robinst - Ah je vois. Merci! –

1

Je suppose que vous devez ajouter le trait de soulignement comme « lettre » ici

 // Find where the word starts 
     int w; 
     for (w = pos; w >= 0; w--) { 
      if (!Character.isLetter(content.charAt(w))) { 
       break; 
      } 
     } 
1

Il a à voir avec cette section insertUpdate():

// Find where the word starts 
int w; 
for (w = pos; w >= 0; w--) { 
    if (! Character.isLetter(content.charAt(w))) { 
     break; 
    } 
} 

Spécifiquement, Character.isLetter() renvoie la valeur false pour le caractère de soulignement. Cela signifie que le mot commence après la position de soulignement. Pour résoudre le problème, vous devez modifier l'instruction if pour autoriser les caractères autres que les lettres que vous souhaitez utiliser dans les mots. Vous pouvez vérifier explicitement '_' ou utiliser Chacter.isWhiteSpace() pour inclure tous les caractères qui ne sont pas un espace, un onglet ou une nouvelle ligne.

+0

@Colin: +1 pour une explication détaillée. –