Avatar billede chalde Seniormester
04. oktober 2007 - 12:37 Der er 11 kommentarer og
2 løsninger

Splitte string

Hejsa!
Er temmelig grøn i faget, så sidder med en lille hovedpine.
Skal lave en applikation som tager imod en streng, og splitter den op så hvert bogstav/tal/mellemrum kommer på hver sin linie.
Vi har fået den til at tage det første ord, men så ender den i et loop. Nogen der har et forslag, så den også får mellemrum med, samt stopper når den har printet hele strengen.

import java.util.Scanner;

public class Words {

    public static void main(String [] args)
    {
        String strengA;
        Scanner stringScan = null;
       
        Scanner scan = new Scanner (System.in);
       
        System.out.print("Skriv strengen: ");       
        strengA = scan.next();       
       
        while (scan.hasNext())
        {
            System.out.println("Hele strengen: " + strengA);

            stringScan = new Scanner (strengA);
            stringScan.useDelimiter("");
                   
        while (stringScan.hasNext())
            System.out.println(stringScan.next());
       
       
        }
    }
}
Avatar billede jakoba Nybegynder
04. oktober 2007 - 13:00 #1
Første skridt er (som sedvanlig) at hitte ud af PRÆCIS hvad der skal gøres.
Du skriver:
    "splitter den op så hvert bogstav/tal/mellemrum kommer på hver sin linie."
og derefter:
    "Vi har fået den til at tage det første ord"

Det passer ikke sammen. skal strengen deles op i bogstaver eller skal den deles i ord ?

mvh JakobA
Avatar billede chalde Seniormester
04. oktober 2007 - 13:20 #2
Bogstaver :) Vi har fået den til at tage første ord i f.eks en sætning.
Lad os sige der skrives "Hello world". Så skal den smide det ud på følgende måde:
Hele strengen: Hello world
H
e
l
l
o

w
o
r
l
d

Lige nu smider den kun følgende ud:
Hele strengen: Hello
H
e
l
l
o

For derefter at loope det.
Avatar billede jakoba Nybegynder
04. oktober 2007 - 13:33 #3
Linien
            System.out.println("Hele strengen: " + strengA);
ku tyde på i havde ønsket at have hele den indtastede streng i 'strengA' på det tidspunkt.
Det skal så specificeres i scan's delimiter:
        scan.useDelimiter("[\r\n]");      // når bruger trykker retur
og når nu strengA indeholder hele linien er der ingen grund til at loope på scan

        Scanner scan = new Scanner (System.in);
        scan.useDelimiter("[\r\n]");      // TILFØJET linie
     
        System.out.print("Skriv strengen: ");     
        strengA = scan.next();     
     
        if (scan.hasNext())              // RETTET  fra WHILE til IF
Avatar billede jakoba Nybegynder
04. oktober 2007 - 13:45 #4
Ups. den der test  (scan.hasNext())  duer ikke, for med System.in som souce vil scan jo vente til evig tid på en næste line før det bliver sandt.
det skal nok hellere være:

if (strengA.length() > 0)
Avatar billede chalde Seniormester
04. oktober 2007 - 14:10 #5
Nu ser den således ud (hvis jeg har forstået korrekt):
import java.util.Scanner;

public class Words {

    public static void main(String [] args)
    {
        String strengA;
        Scanner stringScan = null;
       
        Scanner scan = new Scanner (System.in);
        scan.useDelimiter("[\r\n]");   
       
        System.out.print("Skriv strengen: ");   
        strengA = scan.next();       
       
        if (strengA.length() > 0)
        {
            System.out.println("Hele strengen: " + strengA);

            stringScan = new Scanner (strengA);
            scan.useDelimiter("[\r\n]");
                   
        while (stringScan.hasNext())
        System.out.println(stringScan.next());
       
       
        }
    }
}


Men det giver følgende output:
Skriv strengen: hello world
Hele strengen: hello world
hello
world

Hvor det jeg ønsker er:
Skriv strengen: Hello world
Hele strengen: Hello world
H
e
l
l
o

w
o
r
l
d
Avatar billede jakoba Nybegynder
04. oktober 2007 - 17:16 #6
det er fordi du har fjernet delimiteren for den anden scanner 'stringScan' der burde stadig stå
      stringScan.useDelimiter("");
for den.
Avatar billede chalde Seniormester
04. oktober 2007 - 19:15 #7
Jeg ved ik helt hvor jeg stod af, men det er jeg vist nu (hmm, java kan vist være en stærk kop at starte på).
Beklager at jeg er lige en tand bagud her, men kan jeg få dig til at skrive hvorhenne den mangler. Har forsøgt at smide delimiter ind på hver scan for sig selv, samt på dem alle, og den deler dem kun op pr. ord, ikke bogstav.
Avatar billede jakoba Nybegynder
04. oktober 2007 - 19:55 #8
public class Words {

    public static void main(String [] args)
    {
        String strengA;
        Scanner stringScan = null;
     
        Scanner scan = new Scanner (System.in);
        scan.useDelimiter("[\r\n]"); 
     
        System.out.print("Skriv strengen: "); 
        strengA = scan.next();     
     
        if (strengA.length() > 0)
        {
            System.out.println("Hele strengen: " + strengA);

            stringScan = new Scanner (strengA);
            stringScan.useDelimiter("");  // ÆNDRET linie
                 
            while (stringScan.hasNext())                // ÆNDRET indrykning
                System.out.println(stringScan.next());  // ÆNDRET indrykning
     
     
        }
    }
}

Programmering er ligesom videnskab. Det er EKSAKT.
Ovenfor havde du udskiftet linien
            stringScan.useDelimiter("");    // korrekt
med
            scan.useDelimiter("[\r\n]");    // forkert scannner og forkert parameter
og jeg vil vædde på at du ikke kan fortælle mig hvorfor du gjorde det. Det skulle ikke undre mig hvis du sågar har glemt at du ændrede den linie :-)

chancen for at få noget godt ud af at 'prøve sig frem' er mikroskopisk når du programmerer.
Og det er desværre ikke sådan mennesker normalt tænker (eller gudskelow, for hvis de gjorde ville vi alle være lige så handlingslammede som du føler dig nu). Det er så noget du skal have lært, at tanke exakt istedet for bare at prøve dit og dat. Når indskydelsen kommer så STOP. tænk, læs dokumentation, og når du så har en ide om hvad du vil gøre og hvad effekt det vil have så prøv det. men vær klar til at ændre tilbage igen. Det er at eksperimentere, og det er helt fint for det lærer man af.

mvh JakobA
Avatar billede chalde Seniormester
04. oktober 2007 - 23:39 #9
Så kører den. Men for djævlens jeg havde stirret mig blind på de 2 scannere og tilhørende delimiters.
Og giver dig ret i at man ikke bare prøver sig frem :)
Sidder og nærlæser Java Software Solutions igen. Og den bog er bestemt ikke velskrevet :( bruger javabog.dk ved siden af som er lidt nemmere at benytte. Bare lidt skidt at undervisningen kører efter Java Software Solutions, og javabog.dk gennemgår emnerne på en helt anden måde.

Men tusind tak for hjælpen. Gav mig et bedre indblik i delimiter (som er et mindre hængeparti). Smid endelig et svar. Point for tålmodigheden og hjælpen er velfortjent :)
Avatar billede arne_v Ekspert
04. oktober 2007 - 23:47 #10
Er der noget i opgave formuleringen som forbyder den primitive løsning ?

public class S {
    public static void main(String[] args) {
        Scanner scn = new Scanner(System.in);
        String line = scn.nextLine();
        for(int i = 0; i < line.length(); i++) {
            System.out.println(line.charAt(i));
        }
    }
}
Avatar billede jakoba Nybegynder
05. oktober 2007 - 03:02 #11
takker.
Avatar billede chalde Seniormester
05. oktober 2007 - 17:46 #12
arne_v bestemt ikke :)
virker også fint.
Så lærte jeg endnu mere. Havde startet med for, men det gik lidt i bananas for os.
Smid endelig også et svar. Afsætter flere point og deler lige op.
Tusind tak for hjælpen begge 2 :)
Avatar billede arne_v Ekspert
06. oktober 2007 - 05:57 #13
.
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