Problème Fonction De Conversion

Fermé
M56 - Modifié par KX le 23/08/2015 à 12:43
 M56 - 23 août 2015 à 15:27
Bonjour,
Ça fait deux jours que je suis bloquée sur une fonction dont je ne comprend pas l'erreur. Il s'agit d'un fonction qui prend en paramètre un mot et un tableau, dans un premier temps elle convertie le mot en minuscules, dans un second temps elle le compare au tableau. Si le mot apparait dans le tableau elle retourne True sinon False.
Voici le code :

static String [] TableauNoms = {"anglais", "suedois", "danois", "allemand", "norvegien"}; 
 
 public static boolean ValideAscii (String mot, String [] Tab){
  int i = 0;
  char character;
  int ascii;
  boolean bool = false;
  boolean FauxCaract = false;
  String mot2 = "";
  
  while(i < mot.length()){
   character = mot.charAt(i);
   ascii = (int)character;
   if(ascii < 97){
    ascii = ascii + 32;
    character = (char)ascii;
    mot2 = mot2 + character;
   }else if(ascii > 122){
    FauxCaract = true;
    break;
   }
   else{
    mot2 = mot2 + character;
   }
   i++;
  }

  i = 0;
  if(FauxCaract == false){
   while(i != Tab.length){
    Ecriture.uneChaine(mot2);
    Ecriture.uneChaine(Tab[i]);
    if(mot2 == Tab[i]){
     bool = true;
     break;
    }
    i++;
   }
  }
  return bool;
 }


--------------Main---------------

if(ValideAscii("Suedois", TableauNoms) == false){
 Ecriture.uneChaine("False");
}else{
 Ecriture.uneChaine("True");
}


Milles remerciements a celui qui réussira a trouver la solution !!!!

A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 23/08/2015 à 12:48
Bonjour,

En jetant un oeil rapide au code, ça c'est faux :
if(mot2 == Tab[i]){

Si tu utilises l'opérateur
==
sur deux objets ce que tu compares ce sont leurs références, qui seront forcément différentes dans ton cas, pour comparer les objets par valeur il faut utilser la méthode
equals
:
if(mot2.equals(Tab[i])){

Remarque : il y aurait tellement d'autres critiques à faire sur ton code...
La confiance n'exclut pas le contrôle
0
Merci ça marche !

Chacun sa méthode mais si ça peut me permettre de progresser, qu'aurait tu changer dans mon code ?
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 août 2015 à 14:54
Pour commencer, c'est un détail, Java ne travaille pas en ASCII, mais en UTF-16, donc déjà le nom de la méthode ValideAscii n'a pas trop de sens... ce que tu fais en réalité c'est vérifier que le mot ne contient que des lettres latines sans accents.

Ensuite, ça ne sert à rien de faire des comparaisons à true ou false.
Si tu fais
if ( x == true )
, cela n'est vrai que si x vaut true donc puisque x vaut true tu peux directement faire
if ( x )
, de la même manière au lieu de faire
if ( x == false )
, tu peux directement écrire
if ( !x )
ce qui est plus propre.

Autre chose, plus embêtant, c'est que tu déclares toutes tes variables au début du code, or il ne faudrait les déclarer qu'au moment où tu t'en sers (si tu t'en sers...)

Il y a également ton utilisation de ta première boucle while, en réalité c'est une boucle for que tu fais, alors autant l'utiliser directement en boucle for.
Au passage, cela ne sert à rien de continuer les calculs avec FauxCaract = true, puisque derrière la seule chose que tu fais c'est if (FauxCaract == false), autant faire directement un return tout de suite, puisque tu connais déjà le résultat...

Puis viennent les "valeurs magiques", ce sont par exemple les 97 et 122 qui sont en plein milieu du code, pourquoi 97, pourquoi 122... à la lecture du code ça n'a pas de sens, il vaut mieux mettre ces valeurs en constantes, ou dans ton cas utiliser des char 'a' et 'z'
Au passage, on peut mélanger les calculs avec int et char, ce n'est pas la peine de faire deux variables, une en int et l'autre en char et faire les conversions dans les deux sens.
Remarque : dans ta méthode tu ajoutes 32, je penses qu'il vaudrait mieux gérer à part le cas des majuscules car tu ne testes pas le cas où tu un caractère plus petit que 'A' ou entre 'Z' et 'a', tu lui ajoutes juste 32 et tu le rajoutes au mot sans savoir si en lui rajoutant 32 tu est bien entre 'a' et 'z'...

Question d'optimisation, mais je le laisse de côté pour l'instant, utiliser l'opérateur + sur deux String est coûteux dans une boucle, car tu vas reconstruire autant de String que tu fais de + il vaudrait mieux utiliser un StringBuilder pour faire ce genre d'opérations.

À noter aussi qu'il y a des conventions de nommages en Java, c'est pas juste pour faire joli et tu devrais apprendre les utiliser le plus tôt possible (dès aujourd'hui par exemple...)
Les noms de variables et de méthodes commencent par une minuscule.
Les conventions impliquent également de tout écrire en anglais...

Et pour terminer, je te déconseilles l'utilisation de classes non standards comme Ecriture.uneChaine(...), ça ne peut fonctionner que parce que tu ajoutes des dépendances inutiles dans ton code ou pire en bidouillant le JDK... alors qu'évidemment Java sait très bien faire cela tout seul.

Voici le même algorithme mais en prenant en compte mes remarques :

private static String[] NAMES = { "anglais", "suedois", "danois", "allemand", "norvegien" };

public static boolean isWordInTab(String word, String[] tab) {

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < word.length(); i++) {

        char character = word.charAt(i);

        // cas où ce n'est pas une minuscule dans le mot
        if (character < 'a' || character > 'z') {

            // si ce n'est pas une majuscule non plus c'est faux
            if (character < 'A' || character > 'Z')
                return false;

            // cas des majuscules : on les passe en minuscule
            character = (char) (character - 'A' + 'a'); // + 32
        }

        // character est une lettre minuscule
        sb.append(character);
    }

    // si on arrive jusqu'ici c'est que le mot ne contient que des lettres minuscules

    String word2 = sb.toString();

    for (String str : tab)
        if (str.equals(word2)) // le mot correspond à un du tableau
            return true;

    // aucun mot n'a été trouvé dans le tableau
    return false;
}

public static void main(String[] args) {
    System.out.println(isWordInTab("Suedois", NAMES));
}

Pour info, Java gère déjà le cas des minuscules et majuscules, il suffit d'utiliser la méthode equalsIgnoreCase de la classe String pour comparer deux String et renvoyer true s'ils sont égaux aux majuscules/minuscules prêt, ce qui simplifie considérablement ton code :

public static boolean isWordInTab(String word, String[] tab) {

    for (String str : tab)
        if (str.equalsIgnoreCase(word))
            return true;

    return false;
}
0
M56 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
23 août 2015 à 15:27
D'accord, je me prend un peu une claque là x)
Y'avait une ou deux choses que je savais mais tu m'en apprend beaucoup !
A vrai dire je suis un peu débutante. Je vais regarder ton code plus attentivement et essayer de corriger mes projets, j'ai du boulot !
Dans tout les cas merci beaucoup pour ton aide et ta patience !
0