Estoy intentando escribir un programa para la escuela que cuente la frecuencia de tokens (palabras en este caso) en un archivo dado. El programa controlador debe usar una estructura de lista para obtener cada palabra en el mismo formato del archivo. Luego, se crea un objeto FreqCount y eventualmente usará el hashmap para contar la frecuencia del token. Obtuve el controlador para leer el archivo y colocarlo en una ArrayList, pero ahora el problema es que (a) el código para ingresar la lista no funciona, por lo que está vacío (b) la función de impresión no funciona correctamente (poco probable ya que lo arranqué directamente de w3schools para probar). He pensado en esto por un tiempo y no puedo entender por qué no funciona.
Conductor:
package threetenProg3; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.util.ArrayList; import threetenProg3.FreqCount; public class Driver { public static void main(String[] args) throws FileNotFoundException{ File in = new File("test.txt"); Scanner scanFile = new Scanner(in); ArrayList<String> parsed = new ArrayList<String>(); FreqCount fc = new FreqCount(parsed); while(scanFile.hasNext()) { //if this ends up cutting off bottom line, make it a do while loop parsed.add(scanFile.next().toLowerCase()); } System.out.println("ArrayList: \n"); for(int i = parsed.size()-1; i>=0; i--) { //prints arraylist backwards System.out.println(parsed.get(i)); } System.out.println("\n Hashmap: \n"); fc.printMap(); scanFile.close(); } }Recuento de frecuencias:
package threetenProg3; import java.util.HashMap; import java.util.ArrayList; public class FreqCount { HashMap<String, Integer> map = new HashMap<String, Integer>(); FreqCount(ArrayList<String> plist){ for(int i = plist.size()-1; i>=0; i--) { //puts list into hashmap map.put(plist.get(i), 1); } } //methods public void printMap() { for (String i : map.keySet()) { System.out.println("key: " + i + " value: " + map.get(i)); } } }Lo único que se me ocurrió fue cambiar la Lista a una ArrayList, pero eso no tuvo ningún efecto.
Editar: Me di cuenta de que olvidé un montón de cosas importantes aquí.
Archivo de texto:
ONE TWO ThReE FoUR fIve six seven EIGHT NINE TEN ELEVENque salidas:
eleven ten nine eight seven six five four three two oneAl imprimir la lista de arreglos, funciona perfectamente. El problema es cuando se trata de imprimir el hashmap. Actualmente, la salida para imprimir el mapa hash está en blanco (ya que no aparece nada después de "Hashmap:".
Gracias a cualquiera que pueda ayudar, los comentarios rápidos son muy apreciados :)
debe crear un contador de frecuencia después de leer la lista porque está insertando valores en el mapa en el constructor. Y dado que la lista aún está vacía cuando creó FreqCount, no ve ningún resultado.
package threetenProg3; import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; import java.util.ArrayList; import threetenProg3.FreqCount; public class Driver { public static void main(String[] args) throws FileNotFoundException{ File in = new File("test.txt"); Scanner scanFile = new Scanner(in); ArrayList<String> parsed = new ArrayList<String>(); while(scanFile.hasNext()) { //if this ends up cutting off bottom line, make it a do while loop parsed.add(scanFile.next().toLowerCase()); } System.out.println("ArrayList: \n"); for(int i = parsed.size()-1; i>=0; i--) { //prints arraylist backwards System.out.println(parsed.get(i)); } System.out.println("\n Hashmap: \n"); FreqCount fc = new FreqCount(parsed); // Moved fc here fc.printMap(); scanFile.close(); } }Esta línea:
FreqCount fc = new FreqCount(parsed); no "vincula" mágicamente la lista de matrices parsed al mapa. Simplemente agrega lo que está actualmente parsed en fc.map . Si examina su código, verá que parsed está vacío en el momento en que se ejecuta la línea anterior. Entonces no estás agregando nada al mapa.
Debe mover esa línea después de haberla agregado a la lista de arreglos. Por ejemplo, justo antes de imprimir "Hashmap:" :
FreqCount fc = new FreqCount(parsed); System.out.println("\n Hashmap: \n"); fc.printMap();