Avatar billede ulrikp Nybegynder
12. august 2002 - 16:09 Der er 9 kommentarer og
1 løsning

String størrelse

Jeg har en servlet, som gerne skulle danne en html-tabel med 31 rækker og 96 kolonner, hvilket giver 2976 celler. Problemet er at få udskrevet denne tabel i browseren. Jeg har følgende kode i min servlet:

    // c[] er et int array med 0 eller et, som er fyldt i tidligere.
    String cal = "";
    for(int i=0; i<2976; i++) {
      if(i%95 == 0) {
        if(i == 0)
          cal += "<tr>";
        else if(i == 2975)
          cal += "</tr>";
        else
          cal += "</tr><tr>";
      }
      if(c[i] == 0) // Ledig
        cal += "<td>0</td>";
      else          // Optaget
        cal += "<td>1</td>";
    }
    out.println(cal);

Når jeg kører servletten med denne kodestump i dør min servletengine (JRUN) fuldstændigt og jeg får ikke noget skrevet ud i browseren.
Er det fordi en string ikke kan være ca. 30.000 karaktere lang, eller hvad kan det være?

ulrikp
Avatar billede jakoba Nybegynder
12. august 2002 - 16:16 #1
hver gang du sådan sige  strengvariabel += "stump"  skal java allokere nyt memoryareal til strengen der nu er blevet længere og frigive og garbage collecte den plads der blev brugt før.
Det tager en hulens tid med alle de  += operationer

Så det er meget muligt at det er alt hvad der er galt. prøv at lave kaffe neæste gang den 'dør' og se om ikke den er blevet færdig når du kommer tilbage 10 minutter efter.

Og skriv så koden om så du ikke bruger så uhyggeligt meget tid.

mvh JakobA
Avatar billede stigc Nybegynder
12. august 2002 - 16:19 #2
Du kan forbedre koden med et char array. Sæt størrelsen til et par tusinde, og gør det dobbelt så stor når du når sidste tegn. Char arrayet kan til sidst forvandles til en JAVA streng.

Problemet er at den helle tiden skal allokere et nyt RAM område til den nye streng, som bare er et par tegn større..
Avatar billede carstenknudsen Nybegynder
12. august 2002 - 16:35 #3
Det nemmeste er at benytte StringBuffer
klassen, der effektivt sørger for at
afsætte den nødvendige plads.
StringBuffer buffer = new StringBuffer();
for (....) {   
buffer.append("klfjjfldkj");
}
String s = buffer.toString();
Avatar billede stigc Nybegynder
12. august 2002 - 16:40 #4
og evt. kalde den med:

StringBuffer buffer = new StringBuffer(30000);

eller hvad der er passende....
Avatar billede ulrikp Nybegynder
12. august 2002 - 16:43 #5
Det er lige netop StringBufferen jeg er begyndt at eksperimentere med og det ser ud til at køre meget bedre, så tak for hjælpen gutter.
Avatar billede jakoba Nybegynder
12. august 2002 - 17:15 #7
Vil den løkke forresten ikke ende med at skrive <td>B</td> efter den sidste </tr>?
Avatar billede stigc Nybegynder
12. august 2002 - 17:26 #8
Nu kiggede jeg også lige på koden..
Når du bruger out.println(cal) så skrive du jo til buffer, hvilket du bare hele tiden kan gøre. Altså i stedet for at samle det i en streng, så udskriv med det samme:

cal += "<td>1</td>";

udskiftes med:

out.println("<td>1</td>");

Det burde være det hurtigste!
Avatar billede jakoba Nybegynder
12. august 2002 - 17:53 #9
// c[] er et int array med 0 eller et, som er fyldt i tidligere.
    int i,j;
    for ( i=0; i<2976; i+96) {  // NB: 96 går op i 2976.
        out.println( "<tr> );
        for ( j=i; j<i+96; j++ ) {
            out.println( (c[j]==0) ? "<td>0</td>" : "<td>1</td>" );
        }
        out.println( "</tr>" );
    }

og noget simplere :)
Avatar billede stigc Nybegynder
12. august 2002 - 18:55 #10
:)
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