Avatar billede mik28 Seniormester
12. juni 2006 - 13:38 Der er 25 kommentarer og
1 løsning

Problem med substring

Hej Eksperter,

Jeg forstår ikke hvad der er galt med det her

String [] tegn = new String[224];
            String [] kode = new String[224];
            int i = 0;
       
            while (!eof) {
                String line = buff.readLine();
                if (line == null)
                    eof = true;
                else
            //    System.out.println(line);
            //    tegn[i] = line;
                tegn[i] = line.substring(1,1);
                kode[i] = line.substring(3,line.length());
            //    System.out.println(tegn[i]);
                i++;
            }


Jeg får denne fejl

java.lang.StringIndexOutOfBoundsException: String index out of range: -2
Avatar billede mik28 Seniormester
12. juni 2006 - 13:40 #1
Der er ingen problemer med

tegn[i] = line;
Avatar billede arne_v Ekspert
12. juni 2006 - 13:44 #2
hvad indeholder line ?
Avatar billede mik28 Seniormester
12. juni 2006 - 13:48 #3
en linie fra en fil.

f.x. a=kjrfbwuibfuisbuwbeubfw
Avatar billede arne_v Ekspert
12. juni 2006 - 13:49 #4
prøv og udskriv line i din while løkke

din kode skal jo dø hvis længden af line er mindre end 3
Avatar billede mik28 Seniormester
12. juni 2006 - 13:50 #5
Okay. Det er den
Avatar billede arne_v Ekspert
12. juni 2006 - 13:56 #6
prøv og udskriv

man har før hørt om en blank linie i bunden af en fil
Avatar billede mik28 Seniormester
12. juni 2006 - 14:03 #7
=fajsrgnjgsrjnsg
Avatar billede mik28 Seniormester
12. juni 2006 - 14:08 #8
Det ser tilsyneladende rigtigt ud. Er der en måde man kan få at vide hvor mange linier der er i en fil
Avatar billede mik28 Seniormester
12. juni 2006 - 14:26 #9
Ville det være smartere at gøre noget i den her retning?

Vector tegn = new Vector();
Vector kode = new Vector();
int i = 0;
       
    while (!eof) {
        String line = buff.readLine();
        if (line == null)
            eof = true;
        else
        System.out.println(line);
       
        tegn.addElement(line.substring(1,1));
        kode.addElement(line.substring(3,line.length()));
           
        i++;
        }
Avatar billede mik28 Seniormester
12. juni 2006 - 14:27 #10
Det løser dog ikke mit problem.
Avatar billede arne_v Ekspert
12. juni 2006 - 15:01 #11
Vector er bedre , men ArrayList er endnu bedre
Avatar billede arne_v Ekspert
12. juni 2006 - 15:05 #12
den doer paa

=fajsrgnjgsrjnsg

??
Avatar billede mik28 Seniormester
12. juni 2006 - 15:07 #13
Det sidste var bare en kikser. Jeg tror jeg forsøger mig med Vector i første omgang. Jeg har prøvet at skrive indholdet af et af arrays ud. Jeg får værdierne som står i filen med til sidst er der en NULL
Avatar billede arne_v Ekspert
12. juni 2006 - 15:16 #14
ahh

proev og erstat

while (!eof) {
    String line = buff.readLine();
    ...
}

med den klassiske:

String line;
while ((line = buff.readLine()) != null) {
    ...
}
Avatar billede mik28 Seniormester
12. juni 2006 - 15:33 #15
Det virkede. Jeg forstår bare stadig ikke hvorfor den anden måde åbenbart kørte løkken igennen en gang mere end der var linier?
Avatar billede mik28 Seniormester
12. juni 2006 - 15:34 #16
Det her virker

String line;
            while ((line = buff.readLine()) != null){
           
                if (line == null)
                    eof = true;
                else    
                tegn.addElement(line.substring(0,1));
                kode.addElement(line.substring(2,line.length()));
               
                System.out.println(tegn.elementAt(i));
                System.out.println(kode.elementAt(i));
                System.out.println("i er: "+i);

                i++;
            }
Avatar billede arne_v Ekspert
12. juni 2006 - 15:43 #17
jeg tror faktisk ogsaa at det virker med nogle {}

            while (!eof) {
                String line = buff.readLine();
                if (line == null)
                    eof = true;
                else
                { // <----
                    tegn[i] = line.substring(1,1);
                    kode[i] = line.substring(3,line.length());
                    i++;
                } // <----
            }
Avatar billede arne_v Ekspert
12. juni 2006 - 15:44 #18
men den anden maade med while loekken er en standard maade at goere det
paa som jeg klart kan anbefale

det goer koden nem at forstaa for andre
Avatar billede mik28 Seniormester
12. juni 2006 - 15:49 #19
Er det her en okay måde at gøre det på. Det virker i hvert tilfælde

while ((line = buff.readLine()) != null){
           
                if (line == null){
                    eof = true;
                }
                else    
                {
                    if(line.length()>2){
                    tegn.addElement(line.substring(0,1));
                    kode.addElement(line.substring(2,line.length()));
                   
               
                    System.out.println(tegn.elementAt(i));
                    System.out.println(kode.elementAt(i));
                    System.out.println("i er: "+i);

                    i++;
                    }
                }
Avatar billede mik28 Seniormester
12. juni 2006 - 15:55 #20
mange tak for hjælpen. Nu kan jeg komme lidt videre :-)
Avatar billede arne_v Ekspert
12. juni 2006 - 16:04 #21
det er dobbelt konfekt

enten skal du bruge den while med assignment inden i eller du skal bruge if og
eof variabel - der er ingen grund til at bruge begge
Avatar billede arne_v Ekspert
12. juni 2006 - 16:20 #22
jeg ligger ogsaa lige et svar
Avatar billede mik28 Seniormester
12. juni 2006 - 16:33 #23
Hvad nu hvis filen ser således ud. Jeg kan ikke lige overskue det.

a=ikbfufwbuifw
b
c=kjbsrfjkbv
Avatar billede esbenp Nybegynder
12. juni 2006 - 22:55 #24
Jeg går ud fra buff er en BufferedReader. I så tilfælde returnerer den ikke null ved EOF, men "" (den tomme streng)
Avatar billede arne_v Ekspert
12. juni 2006 - 23:04 #25
forkert

http://java.sun.com/j2se/1.5.0/docs/api/java/io/BufferedReader.html

readLine

public String readLine()
                throws IOException

    Read a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a linefeed.

    Returns:
        A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached
Avatar billede esbenp Nybegynder
12. juni 2006 - 23:21 #26
Du har ret Arne.
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