0
votes

Comment compter l'occurrence de chaque lettre de l'alphabet à partir d'un fichier texte en Java?

Je suis très nouveau sur Java et j'ai du mal avec ma première mission. La tâche consiste à scanner un fichier texte (para1.txt) et à le lire et à compter le nombre de fois où chaque lettre apparaît. (Donc, il devrait produire quelque chose comme a-57, b-21, c-12, etc.) J'ai l'impression d'être très proche de la réponse, cependant, j'ai un peu de mal à compter les personnages tels qu'ils apparaissent. Actuellement, mon code imprime "17" pour toutes les lettres, car il y a 17 lignes dans le fichier para1.txt. Voici mon code pour l'instant:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class LetterCounter {
    public static void main(String[] args) throws FileNotFoundException {

        Scanner input = new Scanner(new File("src/para1.txt"));

        int[] count = new int[26];

        while (input.hasNextLine()) {
            String answer = input.nextLine();
            answer = answer.toLowerCase();
            char[] characters = answer.toCharArray();

            for (int i = 0; i < 26; i++) {
                count[i]++;
            }
        }

        for (int i = 0; i < 26; i++) {
            StdOut.print((char) (i + 'a'));
            StdOut.println(": " + count[i]);
        }
    }
}


0 commentaires

4 Réponses :


1
votes

Dans votre boucle, vous incrémentez simplement chaque index du tableau count :

int index = c - 'a';
if(index > 25 || index < 0) {
    System.out.println("Invalid character");
} else {
   //process like normal
}

Au lieu de cela, vous pouvez parcourir les caractères code> Array, et incrémentez l'index au niveau du char - 'a' , pour obtenir l'index correct:

for(char c : characters) {
   count[c - 'a']++;
}

Le seul problème avec ceci est que s'il y a des caractères non alphabétiques, cela lèvera une erreur d'index hors limites. Vous voudrez peut-être vous assurer qu'il est dans la plage:

for (int i = 0; i < 26; i++) {
     count[i]++;
}


2 commentaires

Où dans mon code dois-je insérer ces ajouts? Et sont-ils censés être également dans ma boucle while? Quand je l'ai essayé de la façon dont je pensais qu'ils devraient être placés, il n'a imprimé "Caractère invalide" que quatre fois.


Remplacez la boucle for (int i = 0; i <26; i ++) par ce code. (J'ai également eu une faute de frappe dans mon code. Dans le if use index , pas c )



0
votes

Peut-être que vous n'êtes pas encore censé connaître les cartes, mais une solution simple serait d'en utiliser une.

Quelque chose comme ça

HashMap<Character, Integer> chars = new HashMap<>();
for(int i = 0; i < characters.length; i++){
   if(chars.get(characters[i]) == null){
       chars.put(characters[i], 1);
   } else {
      int num = chars.get(characters[i]);
      chars.put(characters[i], num+1); 
}
}

    for(Character c : chars.keyset()){
       print(c + " :" + chars.get(c));
    }

Peut-être des erreurs de syntaxe, l'a écrit ici


0 commentaires

1
votes

Je pense que vous voulez prendre les lettres réelles et peut-être vérifier si vous avez réellement une lettre (et non un blanc ou un nombre).

public class LetterCounter {
    public static void main(String[] args) throws FileNotFoundException {

        Scanner input = new Scanner(new File("src/para1.txt"));

       int[] count = new int[26];

        while (input.hasNextLine()) {
            String answer = input.nextLine();
            answer = answer.toLowerCase();
            char[] characters = answer.toCharArray();
            /// change here!
            for (int i = 0; i< characters.length ; i++) {
                if((characters[i] >='a') && (characters[i]<='z')) {
                     count[characters[i] -'a' ]++;
                }
            }
            /// change ends.
        }

        for (int i = 0; i < 26; i++) {
            StdOut.print((char) (i + 'a'));
            StdOut.println(": " + count[i]);
        }
    }
}


0 commentaires

1
votes

Créez un hashmap avec le caractère comme clé et count (Integer) comme valeur. Hashmap stocke les paires clé-valeur, où clé sera unique et La méthode put () est utilisée pour insérer une clé et une valeur spécifiques dans hashmap.

public class CharCount {
    public static void main(String[] args) {
        File f1 = new File("file-path");
        HashMap<Character, Integer> charMap = new HashMap<Character, Integer>();
        try {
            Scanner in = new Scanner(f1);
            while(in.hasNext()) {
                String inputString = in.nextLine();
                inputString = inputString.replace(" ", "");
                char[] strArray = inputString.toCharArray();
                for (char c : strArray) {
                    if (charMap.containsKey(c)) {
                    // If character is present in charMap, incrementing it's count by 1
                        charMap.put(c, charMap.get(c) + 1);
                    } else {
                        // If char is not present in charMap ,
                        // putting this character to charMap with 1 as it's value
                        charMap.put(c, 1);
                    }
                }
            }
            // Printing the charMap 
            System.out.println(charMap);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}


0 commentaires