Avatar billede martinsorensen Nybegynder
26. november 2008 - 20:58 Der er 10 kommentarer og
1 løsning

hjælp til for løkke.

Hej eksperter.

Jeg har skrevet følgende kode (Det er et udsnit):

                    for(String ord : findOrd)
                    { 
                        int iCounter;
                        //Læser teksten fra en karakter-input-stream, og åbner strem med URL hjemmeside
                    BufferedReader textPaaHjemmeside = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        //Mens sLine ikke er null skal sLine udskrives i textArea1. sb.append(\r\n), \n er en linefeed karakter, \r er en return karakter, linieskift er \n i Unix filer (nogle Windows programmer forstår det dog også), \r\n i Windows filer, skærmbilleder, netværks protokoller
                        while((sLine = textPaaHjemmeside.readLine()) != null)
                        {         
                           
                           
                        // Laver HELE teksten til lowercase for at udelukke at indexOf er casesensitive
                        sLine = sLine.toLowerCase(); //sLine er HTML linjeteksten
                   
                            while(iIndex < sLine.length() && (iNewindex = sLine.indexOf(ord, iIndex)) != -1)
                              {
                                  iCounter++; // tager int counter og ligger én til sig selv.
                                  iIndex = iNewindex + ord.length();
                              }

                        }
                    sTCPAnswer = "Ordet: \"" + ord + "\" er fundet:  " + iCounter + " gange!"; // Udskriver hvor mange gange ordet er blevet fundet. 
                   
                    answer.add(sTCPAnswer);
                    textPaaHjemmeside.close();
                    }



Problemet er at dette stykke kode skal tælle nogle ord i en string ud fra et array.

Det virker fint på det første ord. Hvis det første ord er 5 gange i en tekst så, så skriver den også at ordet er fundet 5 gange. Problemet er så at alle efterfølgende ord ikke bliver talt, men de tager bare værdien af iCounter fra det første ord, så alle ord står der er blevet fundet 5 gange, hvis det første ord blev fundet 5 gange.

Har i nogle ideer?

Jeg sender eller skriver gerne hele koden op til dem som ville have det. Det er bare en hele del.

Mvh

Martin Sørensen
Avatar billede _carsten Nybegynder
26. november 2008 - 21:02 #1
Prøv

    while(iIndex < sLine.length() && (iNewindex = sLine.indexOf(ord, iIndex)) != -1)
      {
          iCounter++; // tager int counter og ligger én til sig selv.
          iIndex = iNewindex + ord.length();
      }

  iIndex = 0;
  iNewindex = 0;

                    sTCPAnswer = "Ordet: \"" + ord + "\" er fundet:  " + iCounter + " gange!"; // Udskriver hvor mange gange ordet er blevet fundet. 
                   
                    answer.add(sTCPAnswer);
                    textPaaHjemmeside.close();
Avatar billede _carsten Nybegynder
26. november 2008 - 21:03 #2
Hov - ikke nemt at se hvad jeg mener, her er den igen

for(String ord : findOrd)

    int iCounter;
    //Læser teksten fra en karakter-input-stream, og åbner strem med URL hjemmeside
BufferedReader textPaaHjemmeside = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    //Mens sLine ikke er null skal sLine udskrives i textArea1. sb.append(\r\n), \n er en linefeed karakter, \r er en return karakter, linieskift er \n i Unix filer (nogle Windows programmer forstår det dog også), \r\n i Windows filer, skærmbilleder, netværks protokoller
    while((sLine = textPaaHjemmeside.readLine()) != null)
    {         


    // Laver HELE teksten til lowercase for at udelukke at indexOf er casesensitive
    sLine = sLine.toLowerCase(); //sLine er HTML linjeteksten
                   
    while(iIndex < sLine.length() && (iNewindex = sLine.indexOf(ord, iIndex)) != -1)
      {
          iCounter++; // tager int counter og ligger én til sig selv.
          iIndex = iNewindex + ord.length();
      }
        iIndex = 0;
        iNewindex = 0;


    }
sTCPAnswer = "Ordet: \"" + ord + "\" er fundet:  " + iCounter + " gange!"; // Udskriver hvor mange gange ordet er blevet fundet. 

answer.add(sTCPAnswer);
textPaaHjemmeside.close();
}
Avatar billede martinsorensen Nybegynder
26. november 2008 - 21:06 #3
Tak fr svaret.

Svaret fra server: Ordet: "google" er fundet:  1 gange!
Svaret fra server: Ordet: "test" er fundet:  1 gange!
Svaret fra server: Ordet: "finans" er fundet:  1 gange!


Det er hvad jeg får. Jeg ved med sikkerhed at ordet finans findes 5 gange.
Avatar billede _carsten Nybegynder
26. november 2008 - 21:32 #4
Vi prøver lige igen


for(String ord : findOrd)

    int iCounter;
    //Læser teksten fra en karakter-input-stream, og åbner strem med URL hjemmeside
BufferedReader textPaaHjemmeside = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    //Mens sLine ikke er null skal sLine udskrives i textArea1. sb.append(\r\n), \n er en linefeed karakter, \r er en return karakter, linieskift er \n i Unix filer (nogle Windows programmer forstår det dog også), \r\n i Windows filer, skærmbilleder, netværks protokoller
    while((sLine = textPaaHjemmeside.readLine()) != null) {         


        // Laver HELE teksten til lowercase for at udelukke at indexOf er casesensitive
        sLine = sLine.toLowerCase(); //sLine er HTML linjeteksten

        while(iIndex < sLine.length() && (iNewindex = sLine.indexOf(ord, iIndex)) != -1) {
              iCounter++; // tager int counter og ligger én til sig selv.
              iIndex = iNewindex + ord.length();
        }
            iIndex = 0;
            iNewindex = 0;

        sTCPAnswer = "Ordet: \"" + ord + "\" er fundet:  " + iCounter + " gange!"; // Udskriver hvor mange gange ordet er blevet fundet. 
    }


answer.add(sTCPAnswer);
textPaaHjemmeside.close();
}
Avatar billede _carsten Nybegynder
26. november 2008 - 21:38 #5
Nej - det er da noget sludder, jeg skal lige have formmateret din kode så jeg kan læse den
Avatar billede _carsten Nybegynder
26. november 2008 - 21:41 #6
Så kom den til at se sådan ud


BufferedReader textPaaHjemmeside = new BufferedReader(new InputStreamReader(connection.getInputStream()));

for(String ord : findOrd){ 
    int iCounter;

    while((sLine = textPaaHjemmeside.readLine()) != null) {         
        sLine = sLine.toLowerCase(); //sLine er HTML linjeteksten

        while(iIndex < sLine.length() && (iNewindex = sLine.indexOf(ord, iIndex)) != -1) {
            iCounter++; // tager int counter og ligger én til sig selv.
            iIndex = iNewindex + ord.length();
        }
       
        iIndex = 0;
        iNewindex = 0;

    }

    sTCPAnswer = "Ordet: \"" + ord + "\" er fundet:  " + iCounter + " gange!";
    answer.add(sTCPAnswer);
    textPaaHjemmeside.close();
}
Avatar billede _carsten Nybegynder
26. november 2008 - 21:47 #7
Vent lige lidt, jeg kokser da totalt rundt i det her !!
Avatar billede _carsten Nybegynder
26. november 2008 - 22:18 #8
Så er vi vist ved at være der, behold endelig selv point - tror aldrig jeg har rodet så meget rundt i det før !!


    public void læsWWW(){
        BufferedReader textPaaHjemmeside = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        int iCounter;

        ArrayList list = new ArrayList();


        while((sLine = textPaaHjemmeside.readLine()) != null) { 
            sLine = sLine.toLowerCase(); //sLine er HTML linjeteksten

            for(String ord : findOrd){ 
                while(iIndex < sLine.length() && (iNewindex = sLine.indexOf(ord, iIndex)) != -1) {
                    addToCounter(1, ord);
                    iIndex = iNewindex + ord.length();
                }


                iIndex = 0;
                iNewindex = 0;

            }
        }


        textPaaHjemmeside.close();
        udskriv();
    }
   

    public void addToCounter(int k, word){
        if(list.size() > 0){
            for(int i = 0; i < list.size(); i++){
                if( ((Antal)list.get(i)).toString().equals(word) ){
                    ((Antal)list.get(i)).add(k);
                    return;
                }
            }
        }

        list.add( new Antal(k, word) );   
    }


    // Udskriv ord og antal
    public void udskriv(){
        for(int i = 0; i < list.size(); i++){
            Antal a = (Antal)list.get(i);

            answer.add( "Ordet: \"" + antal.toString() + "\" er fundet:  " + antal.getAntal() + " gange!" );
        }
    }


    // Lav et object så du kan gemme ord og antal
    public class Antal{
        String ord = "";
        int antal =0;

        public Amtal(String o, int i){
            ord = 0;
            antal = i;
        }

        public void add(int x){
            antal += x;
        }

        public String toString(){
            return ord;
        }

        public int getAntal(){
            return antal;
        }
    }
Avatar billede _carsten Nybegynder
26. november 2008 - 22:20 #9
Aaaargh

    ArrayList list = new ArrayList();

    public void læsWWW(){
        BufferedReader ............
        int iCounter;

        // ArrayList list = new ArrayList(); SKAL VÆRE GLOBAL
Avatar billede martinsorensen Nybegynder
26. november 2008 - 23:47 #10
Det ser rigtigt lovende ud :D

Der er dog nogle problemer med:

  // Udskriv ord og antal
    public void udskriv(){
        for(int i = 0; i < list.size(); i++){
            Antal a = (Antal)list.get(i);

            answer.add( "Ordet: \"" + antal.toString() + "\" er fundet:  " + antal.getAntal() + " gange!" );
        }
    }

den siger at antal.toString() og antal.getAntal ikke findes???
Avatar billede _carsten Nybegynder
27. november 2008 - 07:57 #11
Det må skyldes en tastefejl i objectet Antal

    public class Antal{
        String ord = "";
        int antal =0;

        // Ret 'Amtal' til Antal, jeg har skrevet et 'm'
        public Amtal(String o, int i){ 
            ord = 0;
            antal = i;
        }
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