2008-11-05 9 views
0

Je dois voir si une valeur de chaîne correspond à une valeur d'objet, mais pourquoi cela ne fonctionnera-t-il pas?Problème de correspondance chaîne Java contre tableau

public int countPacks(String flavour) { 
    int counter = 0; 
    for(int index = 0; index < packets.size(); index++) {    
     if (packets.equals(flavour)) { 
      counter ++; 
     } 
     else { 
      System.out.println("You have not entered a correct flavour"); 
     } 
    } 
    return counter; 
} 

Répondre

3

Vous voulez dire probablement quelque chose comme

if (packets.get(index).equals(flavour)) { 
    ... 
12

Qu'est-ce que "paquets"? Ce ne sera pas une chaîne - alors, comment cela équivaudrait-il à une chaîne de caractères?

je soupçonne que vous vouliez dire votre test soit:

if (packets.get(index).equals(flavour)) 

Cependant, vous allez encore imprimer « Vous avez pas entré une saveur correcte » pour chaque paquet de la saveur « mauvais », même s'il y a un avec la bonne saveur!

Je suppose que vous voulez déplacer l'erreur de déclaration à la fin du procédé, après la boucle, et seulement exécuter si counter == 0

0

Vous devriez le faire de cette façon d'être des chaînes certian vous êtes vraiment la comparaison dans la manière la plus infaillible possible.

I a également fixé la boucle

public int countPacks(String flavour, List packets) 
    { 
     int counter = 0; 
     for (Iterator iter = packets.iterator(); iter.hasNext();) { 
      Map packet = (Map) iter.next(); 

      if (packet.get("flavour").toString().equalsIgnoreCase(flavour)) { 
       counter ++; 
      } 
      else { 
      System.out.println("You have not entered a correct flavour"); 
      } 
     } 
     return counter; 
    } 
2

En supposant des paquets est une collection (et que vous utilisez JDK 1.5 ou plus), vous pouvez aussi simplement faire la méthode:

public int countPacks(String flavor) { 
    int numOccurrences = java.util.Collections.frequency(packets, flavor); 
    if(numOccurrences == 0) { 
     System.out.println("You have not entered a correct flavor"); 
    } 
    return numOccurrences; 
} 
2

Un problème Avec les méthodes déclarées dans Object, il y a un manque de vérification de type statique dans leur utilisation. La même chose s'applique à synchronisé, où il est courant de verrouiller le mauvais objet.

Dans ce cas, Object.equals (Object) fonctionne avec deux objets. Vous avez utilisé la collection, les paquets, au lieu d'en récupérer un élément. La question importante n'est pas de savoir comment ce bug particulier est arrivé, mais comment pouvons-nous l'empêcher de se produire en premier lieu.

Tout d'abord, utiliser les génériques et obtenir assigner chaque élément pour l'itération à un statiquement typé locale:

public int countPacks(String flavour) { 
    // [ The field represents a count. ] 
    int count = 0; 
    for(int index=0; index<packets.size(); ++index) { 
     String packet = packets.get(index); 
     if (packet.equals(flavour)) { 
      ++count; 
     } 
    } 
    // [The error mesage was printed for each non-match. 
    // Even this is probably wrong, 
    // as it should be valid to have no packs of a valid flavour. 
    // Having the message in this method is actually a bit confused.] 
    if (count == 0) { 
     System.out.println("You have not entered a correct flavour"); 
    } 
    return count; 
} 

Nous pouvons encore bien rangé ce à l'aide de la boucle améliorée. Cela semble plus clair, mais un bon programmeur connaît ses bibliothèques.

public int countPacks(String flavour) { 
    int count = Collections.frequency(packets, flavour); 
    if (count == 0) { 
     System.out.println("You have not entered a correct flavour"); 
    } 
    return count; 
} 

Vous pouvez également envisager un Map<String,Integer> au lieu de la collection.

Questions connexes