2010-02-09 7 views
0

FYI. Un autre exercice de pratique auquel je suis coincé. Le problème est de trouver le nombre d'occurrences de chaque chiffre dans une chaîne. J'ai l'impression d'être assez proche, mais je reçois des résultats décevants. Je suis un débutant, alors s'il vous plaît gardez des conseils/aide à mon niveau si possible. Merci!Trouver le nombre d'occurrences de chaque chiffre dans la chaîne

Voici ce que j'ai jusqu'à présent:

import java.util.Scanner; 

    public class Practice5 { 
public static void main(String[] args) { 
    Scanner input= new Scanner(System.in); 
    System.out.println("Enter a string"); 
    String s = input.next(); 

    int[] counts = countNumbers(s); 

    String output = ""; 

    for (int i = 0; i < counts.length; i++) { 
    if (counts[i] != 0) 
         { 
      output += "Digit" + (char)('0' + i) + " appears " + 
      counts[i] + ((counts[i] == 1) + " times\n"); 
         } 

      } 

       System.out.print(output); 
      } 


private static int[] countNumbers(String s) { 
    int[] counts = new int[10]; 

    for(int i = 0; i < s.length(); i++) { 
    if (Character.isDigit(s.charAt(i))); 
    counts[s.charAt(i) - '0']++; 
    } 
    return counts; 
} 
} 

Ok. Maintenant, si j'entre une chaîne comme "23 t5t6 u76u 232 g1"

je reçois:

2 appears 1 time 
3 appears 1 time 

Ceci est évidemment incorrect. Il devrait être 2 apparaît 3 fois, 3 se produit 2 fois, 5 se produit 1 fois, etc. Toute aide serait appréciée.

+0

Je recule l'inclusion de la solution dans le poste, il vaut mieux avoir une réponse – mpromonet

Répondre

4

Votre premier problème est avec l'utilisation du scanner Java. Si je ne me trompe pas, vous lisez seulement la première sous-chaîne jusqu'au premier espace. Vous avez probablement voulu parcourir toute la chaîne, donc un scanner n'est pas la bonne chose à utiliser.

Une fois que vous obtenez la chaîne entière, vous avez toujours un problème. Le problème majeur dans votre code est que, dans la ligne qui lit

if (Character.isDigit(s.charAt(i))); 

vous avez un point-virgule à la fin. Par conséquent, la ligne suivante (où vous mettez à jour les valeurs) est toujours exécutée. C'est un problème car parfois votre personnage ne serait pas un chiffre, donc l'index "character-'0" "pourrait tomber en dehors des 10 que vous avez définis. Cela devrait être intercepté par Java pour créer une exception. Vous ne voyez pas cette exception car votre code traitera uniquement le premier "23"

+0

+1 Yup, vous voyez '2 apparaît 1 fois' seulement parce que 's' ne contient que '23'. Il coupe au premier espace. –

1

supprimer le point-virgule à la fin de cette déclaration:

if (Character.isDigit(s.charAt(i))); 

Votre style de codage vous cause des problèmes. Si vous souhaitez adopter certaines conventions sensibles (par exemple, intention cohérente, accolades autour de TOUS les blocs comme si/else et for), vous n'aurez aucun problème à repérer cette erreur.

+0

Merci. Je pense que ça a juste été chamboulé quand je l'ai posté ici. J'essaie de le garder aussi propre que possible. Je vais essayer de voir si c'est le problème. Merci – relyt

1

En plus du point-virgule supplémentaire que les autres ont mentionné, votre entrée contient des caractères espace ("") mais vous ne lisez que le premier ensemble de caractères jusqu'à l'espace. Vous pouvez utiliser une ligne comme celui-ci pour lire une ligne entière de l'entrée à la place:

String s = new java.io.BufferedReader(new java.io.InputStreamReader(System.in)).readLine(); 

Vous aurez soit besoin d'utiliser un bloc try/catch ou ajouter « jette java.io.IOException » à votre méthode.

+0

Merci dound. Je comprends ce que vous dites, mais nous ne sommes pas autorisés à utiliser io. – relyt

+0

Vinaigre. J'ai fini par le comprendre avec l'aide de certains des commentaires ici. Voir le premier message pour ma solution. Merci – relyt

+0

Super, je suis content que vous ayez tout compris :). –

1

Ceci est trop long pour un commentaire donc je l'ai mis dans une réponse car je pense que c'est intéressant et pas nécessairement bien connu. Par souci d'exhaustivité, il est à noter que je peux entrer une chaîne qui écrase votre programme. Vous affectez un int [] capable de contenir 10 entiers, mais vous devez savoir qu'il y a beaucoup plus de 10 chiffres parmi les caractères Unicode.

Donc votre programme doit lancer un ArrayIndexOutOfBoundsException pour un grand nombre de chiffres.

Vous pouvez imprimer tous les caractères qui sont des chiffres selon Character.isDigit (...) en utilisant le programme suivant (Character.isDigit (...) Prend un entier, donc nous creux en boucle tous les INTS positifs):

for (int i = 0; i < Integer.MAX_VALUE; i++) { 
    if (Character.isDigit(i)) System.out.println(i + ": " + (char) i); 
    } 

Sur ma version Java ceci renvoie 268 ces chiffres (le nombre réel de chiffres peuvent varier d'une version Java à l'autre, en fonction du réel version d'Unicode supportée).

Notez que isDigit (...) ne prend pas un caractère, mais un int, représentant un codepoint Unicode.

48 is a digit: 0 
49 is a digit: 1 
50 is a digit: 2 
51 is a digit: 3 
52 is a digit: 4 
53 is a digit: 5 
54 is a digit: 6 
55 is a digit: 7 
56 is a digit: 8 
57 is a digit: 9 
1632 is a digit: ٠ 
1633 is a digit: ١ 
1634 is a digit: ٢ 
1635 is a digit: ٣ 
1636 is a digit: ٤ 
1637 is a digit: ٥ 
1638 is a digit: ٦ 
1639 is a digit: ٧ 
1640 is a digit: ٨ 
1641 is a digit: ٩ 
1776 is a digit: ۰ 
1777 is a digit: ۱ 
1778 is a digit: ۲ 
1779 is a digit: ۳ 
1780 is a digit: ۴ 
1781 is a digit: ۵ 
1782 is a digit: ۶ 
1783 is a digit: ۷ 
1784 is a digit: ۸ 
1785 is a digit: ۹ 
etc. 
0

vous pouvez utiliser le code ci-dessous pour obtenir les résultats au lieu de vérifier la fonction Character.isDigit: -

public static void main(String[] args){ 
    int[] arr = {0,1,2,3,4,5,6,7,8,9}; 
    String str = "abc123456"; 
    HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>(); 
    for (int i=0;i<10;i++){ 
     hm.put(arr[i], 0); 
    } 
    for (int i=0;i<str.length();i++){ 
     if(hm.containsKey(str.charAt(i) - '0')){ 
      hm.put(str.charAt(i) - '0', hm.get(str.charAt(i) - '0')+1); 
     } 
    } 
    System.out.println(hm); 
} 
1

je vais vous donner un autre algorithme simple que j'ai créé:

public class Ex95 { 

    public static void main(String[] args) { 
     int [] counts = count("1B2A2137455"); 
     for (int i = 0; i < counts.length; i++) { 
      System.out.println("counts of [" + i + "] is: " + counts[i]); 

     } 

    } 
    public static int[] count(String s){ 
     int [] counts = new int[10]; 
     char [] c = s.toCharArray(); 
     int counter = 0; 
     for(int i=0;i<counts.length;i++){ 
      for(int j=0;j<c.length;j++){ 

        if(Character.isDigit(c[j]) && i == Character.getNumericValue(c[j])){ 
         counter++; 

       } 
      } 
      counts[i] = counter; 
      counter = 0; 
     } 
     return counts; 
    } 
} 
Questions connexes