Programa contador

Buen día a todos,

Estoy haciendo un programa en Java que recibe un archivo de texto (txt).
La clase principal lee este archivo con un scanner y guarda el contenido en una arrayList.
Sobre esta clase principal debo codificar la clase con los métodos correspondientes.

En concreto la clase principal es así:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.Scanner;

public class DocumentReader {
       
        /** default file name if no files is passed as argument */
        private static final String DEFAULT_FILE = "file.txt";

        /**
         * Main method
         *
         * @param args
         */

        public static void main (String[] args) {
               
                File f = null;
               
                // check if there is an agument
                if (args.length > 0) {
                        f = new File (args[0]);
                }
                else {
                        // if no argument, the file name is the default
                        f = new File (DEFAULT_FILE);
                }

                // variable to store the words
                Collection<String> words = new ArrayList<String>();
                Scanner scanner;
                try {
                        // Read the file
                        scanner = new Scanner(f);
                        while (scanner.hasNext()) {
                                String word = scanner.next();
                                words.add(word);
                        }
                }
                catch (FileNotFoundException e) {
                        System.out.println("File " + f + " not found");
                }
               
                // Create TxtStatistics
                TxtStatistics txt = new TxtStatistics(words);
               
                System.out.println("---[getOrderedWords]------------------------------");
                // show all words ordered
                for (String s : txt.getOrderedWords()) {
                        System.out.println(s);
                }

                System.out.println();
                System.out.println("---[getWordsByOccurrences]------------------------------");
                // show all words that appear two or more times in the document
                for (Map.Entry<String, Integer> e : txt.getWordsByOccurrences().entrySet()) {
                        System.out.println(e.getKey() + " - " + e.getValue());
                }

                System.out.println();
                System.out.println("---[getWordsByOccurrences]------------------------------");

                // show number of words
                System.out.println("* total words: " + txt.getTotalWords());
               
                // show number of unique words
                System.out.println("* unique words: " + txt.getUniqueWords());
        }
}

He leído sobre la librería StringTokenizer y he visto que puede contar palabras, etc.

Quería ver si tienen algunas sugerencias de cómo puedo desarrollarlo. De momento he empezado con la clase TxtStatistics, y el esqueleto de la misma sería el siguiente (no sé si he creado correctamente el constructor):

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.StringTokenizer;

public class TxtStatistics {
       
        /** original array of words */
        private Collection<String> words;

        /**
         * Constructor
         *
         * @param words array of words in the document
         */

        public TxtStatistics(Collection<String> words) {
                this.words=words;
        }
       
        /**
         * return the number total of words
         *
         * @return number of words
         */

        public int getTotalWords() {
                StringTokenizer palabras = new StringTokenizer("aquí debería ir el archivo");
                int numeroPalabras = palabras.countTokens();
                return numeroPalabras;
        }

        /**
         * return the number of unique words. Words that appear more than once
         * are ignored
         *
         * @return number of unique words
         */

        public int getUniqueWords () {
               
        }

        /**
         * return the list of words sorted alphabetically without case.
         * It is necessary to use an special comparator, if not, the String will be
         * ordered taking the case into account.
         *
         * @return list of words ordered alphabetically
         */

        public List<String> getOrderedWords() {
               
        }
       
        /**
         * return the words and the number of times they appear in the document.
         * The entry key is the word and the entry value is the number of
         * occurrences
         *  
         * @return map with the words and number of occurrences
         */

        public Map<String, Integer> getWordsByOccurrences () {
               
        }

       
}

Sus sugerencias serán muy bienvenidas!

Saludos, javanewbie

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Lestat

Utiliza las etiqueta code

Utiliza las etiqueta <code> y </code> para poner tu codigo en los post.
El uso de la tag < code > hace mas legible el codigo que pones en el foro

No hace falta que utilices el

No hace falta que utilices el StringTokenizer porque cuando lees el archivo en tu método main ya separaste la entrada por tokens utilizando la clase Scanner.

Probablemente ese código del main te lo pasaron y te pidieron que implementaras la clase TxtStatistics y por eso no te diste cuenta.

El constructor luce correcto, lo que tienes que hacer después es implementar tus métodos pero usando lo que tienes a la mano, en este caso una colección de palabras ( Collections<String> words ).

El método getTotalWords() debería de ir así:

public int getTotalWords()  {
    this.words.size();
}

Y listo, pero para que no creas ciegamente en lo que yo te pudiera decir toma un editor de texto y escribe tres palabras y ve si la cuenta te da tres efectivamente.

Luego sigue así con el resto de los métodos pensando en que ya tienes la colección. Es altamente recomendable que pienses primero en como resolver el problema sin pensar en como programarlo. Por ejemplo para contar las únicas podrías llevar un conteo de todas las palabras y ver cuales tienen como contador 1.

En fin, intenta por ahí.

Para que sepas que métodos puedes invocar y que significan puedes leer la documentación en línea:

http://download.oracle.com/javase/7/docs/api/java/util/Collections.html

Suerte