Problema de matriz básica en Java

Looking for help with a basic array problem. Program has to read a sentence and store the frequencies of the word lengths in an array and then print out how many words are 1 letter words, 2 letter words etc.

Soy un programador de Java bastante crudo, pero he hecho una puñalada a continuación, agradecería mucho alguna orientación. Lo que tengo parece compilar pero escupe un maleficio confuso cuando ejecuto el programa e ingreso una oración.

When I enter a sentence into the program I get an salida Me gusta esto:

[I@eb42cbf
[I@eb42cbf
[I@eb42cbf
[I@eb42cbf
[I@eb42cbf
[I@eb42cbf

Mi código:

class WordCount
{
    public static void main(String[] args)
    {
        int wordList[] = new int[20];
        System.out.println("Please enter a sentence.");

        for (int i = 0; i <= wordList.length; i++)
        {
            String s = Console.readToken();
            int x = s.length();
            wordList[x]++;
        }

        int x = 1;

        while (x < wordList.length)
        {
            if (wordList[x] > 0)
                System.out.println(x + "-letter words: " + wordList[x]);
            x++;
        }
    }
}

preguntado el 31 de julio de 12 a las 11:07

Huele a tarea... Además, ¿dónde count ¿viene de? No lo definiste. Tal vez eso debería ser wordList. -

Afraid not, studying for an exam coming up next month using excercises from a book, no solutions or hints are provided unfortunately. I know im doing something silly wrong just cant spot it. -

See my first comment. Additionally, the i en el segundo ciclo comienza desde 1. Creo que debería empezar desde 0. -

@Baz we can probably assume there is no 0-letter word ;-) -

@Dave it makes no sense to force you to use his custom library when the JDK contains a class that does exactly the same thing. Anyway, your code works fine with a Scanner, so if what you posted is exactly what you run, the only possibility is that Console.readToken() does not do what you think it does. -

5 Respuestas

Aquí están mis sugerencias:

  • Usar una Escáners en lugar de su Console.readToken, que no es parte del JDK estándar
  • use standard variable names (i for a counter is better than x)
  • el resto de tu código funciona bien
  • but I would use a for loop instead of the while because you know how many times you need to loop

Here is my version - The changes are: use of a scanner, renaming x into i and changing the while loop into a for loop:

public static void main(String[] args) {
    int wordList[] = new int[20];
    System.out.println("Please enter a sentence.");
    Scanner scanner = new Scanner(System.in); //Use a scanner, part of the standard JDK

    for (int i = 0; i <= wordList.length; i++) {
        String s = scanner.next(); //reads the next string
        int length = s.length();
        wordList[length]++;
    }

    for (int i = 0; i < wordList.length; i++) { //use a for loop
        if (wordList[i] > 0) {
            System.out.println(i + "-letter words: " + wordList[i]);
        }
    }
}

Respondido 31 Jul 12, 11:07

Should the while loop not be

while(i < wordlist.Length){
  if (wordlist[i] > 0){
      System.out.println(i + "-letter words: " + wordlist[i]);
  }
  i++;      
}

Respondido 31 Jul 12, 11:07

That does not make sense: your proposal will be an infinite loop if there is a bucket with no words. - Assylias

Se corrigió el i ++, estaba tratando de ilustrar que el OP estaba usando 'count [i]' en lugar de 'wordlist [i]'. - cabeza23

Apologies I changed the name of my array in an early version hence the discrepancy. - BLL27

private static long wordcount(String line){
    long numWords = 0;
    int index = 0;
    boolean prevWhiteSpace = true;
    while(index < line.length()){
        char c = line.charAt(index++);
        boolean currWhiteSpace = Character.isWhitespace(c);
        if(prevWhiteSpace && !currWhiteSpace){
            numWords++;
        }
        prevWhiteSpace = currWhiteSpace;
    }
    return numWords;
}

Respondido 31 Jul 12, 11:07

Creo que lo que necesita el OP es una explicación de lo que está haciendo mal en lugar de una solución... - Assylias

Aprecio la solución, pero me beneficiaría más recibir consejos sobre dónde me estoy equivocando con mi propia respuesta. Gracias gente. - BLL27

Yet another approach :

int wordList[] = new int[20];
    System.out.println("Please enter a sentence.");
    String s = "";
    try{
        BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
        s  = bufferRead.readLine();        
    }
    catch(IOException e){
        e.printStackTrace();
    }

    String[] s1 = s.split(" ");
    for(int i = 0 ; i < s1.length ; i++){
        int len = s1[i].length(); 
        wordList[len]++; 
    }
    for (int i = 0; i < wordList.length; i++) { //use a for loop
    if (wordList[i] > 0) {
        System.out.println(i + "-letter words: " + wordList[i]);
       }
    }

Respondido 31 Jul 12, 12:07

Si quiere decir que cuando se ingresa una oración como: "Esta es una oración que", la salida debería ser:

palabras de 4 letras: 2

palabras de 2 letras: 1

palabras de 1 letras: 1

palabras de 8 letras: 1

Mi código:

  import java.util.HashMap;
  import java.util.Scanner;

        class WordCount {
            public static void main(String[] args) {
                HashMap<Integer, Integer> statistic = new HashMap<Integer, Integer>();

                System.out.println("Please enter a sentence.");
                Scanner in = new Scanner(System.in);
                String s = in.nextLine();

                String[] words = s.split(" ");

                for (int i = 0; i < words.length; i++) {
                    if (statistic.containsKey(words[i].length())) {
                        Integer value = statistic.get(words[i].length());
                        statistic.put(words[i].length(), value + 1);
                    } else
                        statistic.put(words[i].length(), 1);
                }

                for (Integer num : statistic.keySet()) {

                    Integer key = num;
                    Integer value = statistic.get(num);
                    System.out.println(key + "-letter words: " + value);

                }

            }
        }

Respondido 31 Jul 12, 13:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.