Avatar billede mlunde Nybegynder
23. februar 2011 - 00:13 Der er 16 kommentarer og
2 løsninger

Tælle ord fra en tekst

Hej.

Jeg har nedenstående fra min class. Problemet er, at når jeg printer wordcount, så får jeg bare 0 som resultat. Hvad går der galt i loopet?

    public void count() throws IOException {

        int wordcount = 0;
        String wordlist = "en text med fem ord";
        int index = 0;
        char c = wordlist.charAt(index);
        int wordlistLength = wordlist.length();


        while (index < wordlistLength)
            if (isCharacter(c) == true) {

                index++;

                if (isWhiteSpace(c) == true) {
                   
                    wordcount++;
                    index++;

                }

            }

        System.out.println(wordcount);

    }

    private boolean isWhiteSpace(char next) {
        if ((next == ' ') || (next == '\t') || (next == '\n')) {
            return true;
        }
        return false;
    }

    private boolean isCharacter(char next) {
        if ((next >= 'a') && (next <= 'z')) {
            return true;
        }
        if ((next >= 'A') && (next <= 'Z')) {
            return true;
        }
        return false;
    }
Avatar billede arne_v Ekspert
23. februar 2011 - 00:25 #1
Mangler du ikke at opdatere c i løkken?
Avatar billede mlunde Nybegynder
23. februar 2011 - 00:50 #2
Burde jeg det, når jeg opdaterer index?
Jeg har jo
char c = wordlist.charAt(index);
Avatar billede arne_v Ekspert
23. februar 2011 - 01:34 #3
Det er udenfor løkke, så den udføres kun en gang.
Avatar billede mlunde Nybegynder
23. februar 2011 - 08:41 #4
Jeg prøvede at sætte c++ ind, men det hjalp ikke. Jeg fik stadig output = 0.
Kan du prøve at vise i mit eksempel, hvordan du vil indsætte det?
Avatar billede mlunde Nybegynder
23. februar 2011 - 11:20 #5
Her er den, som den ser ud nu:

    public void count() throws IOException {

        int wordcount = 0;
        String wordlist = "en text med fem ord";
        int index = 0;
        char c = wordlist.charAt(index);
        int wordlistLength = wordlist.length();

        while (index < wordlistLength) {
            if (isCharacter(c) == true) {

                index++;
                c++;

            } else if (isWhiteSpace(c) == true) {

                wordcount++;
                index++;
                c++;
            }
        }

        System.out.println(wordcount);

    }

    private boolean isWhiteSpace(char next) {
        if ((next == ' ') || (next == '\t') || (next == '\n')) {
            return true;
        }
        return false;
    }

    private boolean isCharacter(char next) {
        if ((next >= 'a') && (next <= 'z')) {
            return true;
        }
        if ((next >= 'A') && (next <= 'Z')) {
            return true;
        }
        return false;
    }
Avatar billede arne_v Ekspert
23. februar 2011 - 14:49 #6
Hvorfor laver du:

c++;

?

Hvis det foerste tegn var 'A' saa saetter du c til 'B' i naeste gennemloeb uanset hvilket tegn der er i strengen.
Avatar billede mlunde Nybegynder
23. februar 2011 - 16:19 #7
Jeg må indrømme, at jeg faktisk er i tvivl om hvordan jeg skal håndtere det så.
Hvordan opdaterer jeg c, når index ikke gør arbejdet for mig?
Avatar billede arne_v Ekspert
23. februar 2011 - 16:29 #8
char c = wordlist.charAt(index);

henter et bogstav over paa det tidspunkt hvor linien udfoeres.

Det aendrer ikke c fordi index aendrer sig.
Avatar billede mlunde Nybegynder
23. februar 2011 - 16:51 #9
Jeg er nået her til, men jeg er altså lidt blank på hvordan jeg opdaterer c. Kan du ikke hjælpe med det jeg skal kode præcist?
Nedenstående tæller dog antallet af tegn/spaces i alt, men jeg skal jo kun have talt ord.

public void count() throws IOException {

        int wordcount = 1;
        String wordlist = "en text med fem ord";
        int index = 0;
        char c = wordlist.charAt(index);
        int wordlistLength = wordlist.length();

        while (index < wordlistLength) {
            index++;
           
            if (isCharacter(c) == true) {

                c = wordlist.charAt(index+1);

            } else if (isWhiteSpace(c) == true) {

                wordcount++;
               
            }
           
        }
        System.out.print(wordcount);
       

    }
Avatar billede Druesukker Nybegynder
23. februar 2011 - 17:54 #10
Hvis du bare skal finde antal ord behøver du jo ikke en metode til at finde bogstaver?

Du bliver nødt til at sætte c = wordlist.charAt(index); ind i din while loop udenfor din if..else statement for at opdatere c i hver runde.

En lettere måde at finde en wordcount i en string er med

String[] wordArray = string.split("\\s+");
// "\\s+" betyder alle blanktegn forekomster


System.out.println(wordArray.length()); // udskriver lændgen af den nye array

Læs evt. om class Matcher for mere info om \\s+ og lignende udtryk som \\d{3}
Avatar billede Druesukker Nybegynder
23. februar 2011 - 17:58 #11
Din vil jo opdatere for hvert mellemrum og ikke for hver ord..

Hvis du vil have min metode til at opdatere for hvert mellemrum eller lignende så skal du undlade plusset i "\\s+" til "\\s".
Avatar billede mlunde Nybegynder
23. februar 2011 - 18:02 #12
Mange tak til jer begge.
Jeg fik nu løsningen frem. Vil I ikke lægge et svar, da I begge hjalp, så får I 30p hver :)

public void count() throws IOException {

        int wordcount = 1;

        String wordlist = "enes text med fem ord plus to mere";
        int index = 0;

        int wordlistLength = wordlist.length();

        for (index = 0; index < wordlistLength; index++) {
            char c = wordlist.charAt(index);

            if (isCharacter(c) == true) {

            } else if (isWhiteSpace(c) == true) {

                wordcount++;
            }

        }
        System.out.println(wordcount);

    }
Avatar billede mlunde Nybegynder
23. februar 2011 - 18:06 #13
Ja, det gør den da også.
Jeg SKAL bruge isCharacter() og isWhiteSpace(), så dem kommer jeg ikke udenom. Hvad skal jeg ændre?
Avatar billede Druesukker Nybegynder
23. februar 2011 - 18:25 #14
Du kan lave en variabel boolean måske der er true hvis der lige har været blanktegn, og false hvis der har været andet end blanktegn..
Avatar billede Hvepse Nybegynder
03. marts 2011 - 16:41 #15
Her er en løsning som du måske kan kigge på og bruge.

import java.util.Scanner;
/**
* This class is used to test small task, developed in Java.
*
* @author Martin Rohwedder
* @version 03-03-2011
*/
public class Test {
   
    private static int wordCount;

    /**
    * Main Method.
    * @param args
    */
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in); //A scanner to read the users input.
        boolean stopped = false;
       
        //Print a Welcome Message.
        printWelcome();
       
        while (!stopped) {
            System.out.print(">> ");
            String sentence = input.nextLine().toLowerCase();
           
            if (sentence.equals("end")) {
                stopped = true;
                printGoodbye();
                break;
            } else {
                countWords(sentence);
                printCountedWordsMessage(getWordCount());
            }
        }
    }
   
    /**
    * Count our words in the text provided.
    * @param text A String containing the text.
    */
    private static void countWords(String text) {
        //Split the String every time we have a whitespace.
        String[] words = text.split("\\s+");
       
        //Loop trough our array, and count for every word in the array.
        while (wordCount < words.length) {
            wordCount++;
        }
    }
   
    /**
    * Get the number of words counted.
    * @return An integer with the words counted.
    */
    private static int getWordCount() {
        return wordCount;
    }
   
    /**
    * Print a Welcome/start message.
    */
    private static void printWelcome() {
        System.out.print("Welcome to the Word Counter.\n\n" +
                "If you want to end the program, you have to type 'END',\n" +
                "else just enter a sentence, so I can count the words for you!\n");
    }
   
    /**
    * Print a Goodbye/End message.
    */
    private static void printGoodbye() {
        System.out.print("Thank You, for using the Word Counter.\n" +
                        "Created by Martin Rohwedder (2011)");
    }
   
    private static void printCountedWordsMessage(int numberOfWords) {
        System.out.print("The sentence above has " + numberOfWords + " words.\n");
        wordCount = 0;
    }

}
Avatar billede mlunde Nybegynder
14. marts 2011 - 10:40 #16
Løsningen blev som nedenstående.
Arne_v og druesukker.. læg venligst et svar hver... I får 30p hver..

public void count() throws IOException {

        String word = "";
        BufferedReader input = new BufferedReader(new FileReader(file));
        int readChar;

        while ((readChar = input.read()) != -1) {
            char c = (char) readChar;

            if (isCharacter(c)) {
                word += c;
            } else if (isWhiteSpace(c)) {
                if (!word.equals("")) {
                    words.add(word);
                    word = "";
                }

            }
        }

    }
Avatar billede arne_v Ekspert
14. marts 2011 - 13:40 #17
ok
Avatar billede Druesukker Nybegynder
15. marts 2011 - 00:54 #18
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester