2
votes

Vérifier si une chaîne existe dans le tableau

J'essaye de vérifier si un nom a déjà été utilisé dans le tableau, mais il ne fonctionne que pour le spot [0]. Je suppose que cela vient de la boucle for en booléen qui ne passe qu'une seule fois et ne s'incrémente pas pour vérifier les autres points?

Vous avez essayé de changer différentes boucles if et while

public boolean check(Depot [] depots, String name){
  boolean check = false;
  for (int i = 0; i < depots.length; i++){
     if(depots[i].getDepotName().equals(name))
       return true;
     else {
       return false;
     }
   }
  return check;

}
if (depotCount < 4){ // Runs if the depots are less than 4
    System.out.println("Enter your depots name");
    name = console.next().toLowerCase();
    if (check(depots, name) == true){
       System.out.println("Depot name already exists");
       break;
    }
    else {
      addDepot(depots, name);   
    }              
} else { 
     System.out.println("Only 4 depots are allowed");
     break;
}

Donc ça marche si un prénom comme "Warehouse" et j'essaye de mettre "Warehouse" une seconde fois. mais si j'essaie de mettre le même nom que les seconds emplacements, cela ne revient pas comme vrai.


5 commentaires

le débogage est la clé


Vous n'avez jamais besoin d'écrire quelque chose == vrai : cela équivaut à n'utiliser que quelque chose .


@AndyTurner jusqu'à récemment, je le pensais aussi ... mais peut-être que c'est plus facile à lire (plus fluide ((pour quelqu'un qui n'a pas l'habitude d'écrire du code)))


@CarlosHeuberger l'une des choses importantes pour apprendre à écrire du code est d'apprendre à écrire du code idiomatique, ce qui signifie nécessairement apprendre à lire du code idiomatique.


d'accord mais pas tout le monde qui lit le code doit écrire du code (par exemple, testeurs, managers, autre langue, ...)


5 Réponses :


9
votes

Vous devez supprimer return false; dans la boucle for, si vous y mettez, la boucle for ne s'exécute qu'une fois avec l'index 0.

public boolean check(Depot[] depots, String name) {
    for (int i = 0; i < depots.length; i++) {
        if (depots[i].getDepotName().equals(name))
            return true;
    }
    return false;
}

Vous ne pouvez raccourcir comme ceci sans variable de contrôle.

public boolean check(Depot[] depots, String name) {
    boolean check = false;
    for (int i = 0; i < depots.length; i++) {
        if (depots[i].getDepotName().equals(name))
            return true;
    }
    return check;
}


0 commentaires

2
votes

Dans votre boucle for, vous avez un "else return false". ce que cela fait, c'est que si vous trouvez quelque chose qui n'est pas égal, vous retournez immédiatement faux. Cependant, si vous revenez à n'importe quelle occasion dans votre méthode, la méthode est terminée donc elle ne boucle pas à travers tous les dépôts

public boolean check(Depot [] depots, String name){
    for (int i = 0; i < depots.length; i++){
        if(depots[i].getDepotName().equals(name))
            return true;
    }
    return false;
}


0 commentaires

2
votes

Le problème est que vous revenez toujours sur la première itération de la boucle.

Essayez de modifier votre code comme suit:

if (check(depots, name)) {

De plus, vous n'avez pas besoin de comparer pour vrai dans une instruction if. C'est-à-dire que vous pouvez changer ceci:

if (check(depots, name) == true) {

en ceci:

public boolean check(Depot[] depots, String name) {
    for (int i = 0; i < depots.length; i++) {
        if (depots[i].getDepotName().equals(name))
             return true;
    }
    return false;
}

De plus, vous voudrez peut-être consulter les HashMap . Ceux-ci ont des méthodes telles que:

  • containsKey (key) vérifie si la clé (depotName) est présente ou non
  • get (key) récupère l'enregistrement par clé
  • put (key, value) vous permet d'ajouter (d'insérer) des valeurs dans la carte.
  • il n'y a pas de limite (par exemple, vous n'avez pas besoin de pré-déclarer la taille comme vous le faites avec un tableau).
  • Ils sont assez rapides, d'autant plus que le nombre d'entrées augmente.

Quant à la valeur, cela peut être tout ce que vous voulez. Par exemple, il peut s'agir d'une chaîne contenant l'adresse de l'entreprise. Il peut s'agir d'un entier contenant le nombre d'employés de cette entreprise. Ou, et c'est la meilleure, cela pourrait être une instance d'une classe contenant tous les détails imaginables sur l'entreprise!

Alternativement, si vous n'avez pas besoin de stocker une valeur, vous pouvez toujours utiliser un KeySet , mais les HashMaps sont probablement plus utiles pour vous.


0 commentaires

1
votes

C'est parce que vous avez return false; . Cela termine simplement l'exécution de la méthode (et ce faisant la boucle for) car la valeur false a été renvoyée à l'appel de méthode.

public boolean check(Depot[] depots, String name) {
    boolean check = false;
    for (int i = 0; i < depots.length; i++) {
        if (depots[i].getDepotName().equals(name))
            return true;
    }
    return check;
}


0 commentaires

1
votes

À mon avis, vous devriez supprimer: else {return false; } à partir de votre code:

public boolean check(Depot[] depots, String name) {
    boolean check = false;
    for (int i = 0; i < depots.length; i++) {
        if (depots[i].getDepotName().equals(name))
            return true;
    }
    return check;
}


0 commentaires