Gå til innhold

Lese informasjon fra en fil


Anbefalte innlegg

Hvordan kan jeg finne største og minste tall, og antall ganger dem forekommer i en ekstern fil ved navnet "Datafil" som består av tall mellom 1 og 1000000? Skal også kunne telle opp antall linjer i filen.

 

Jeg har fått til å finne summen og gjennomsnittet av tallene i filen ved hjelp av klassen

java.util.Scanner; og Scanner src = new Scanner(new File("Datafil")); med metodene:

 

while (src.hasNext())
      {
        value = Integer.parseInt(src.next());
 	sum += value;
        count++;
      }
                if (count == 0)
         System.out.println ("Ingen verdier funnet"); 
              else
      {
         average = ((double)sum / (double)count);

 

- Men lurer altså på hvilke metoder som skal till for å finne største og minste tallet i filen, og antall ganger det forekommer. Samt telle opp antall linjer. Skjønner at det ikke er mye som skal til, men ser altså ikke det som trengs :hmm:

Lenke til kommentar
Videoannonse
Annonse

Jeg ville lest en og en linje med bufferedreader og filereader

BufferedReader in
  = new BufferedReader(new FileReader("foo.in"));
String line = "";
int lineCount = 0;
int total = 0;
int max = Integer.MIN_VALUE;
int maxCount = 0
int min = Integer.MAX_VAULE;
int minCount = 0;
int value;
while (line != null){
    line = in.readLine();
    lineCount++;
    for (String s : line.split(" ")){ //En eller annen regex kombinasjon
       value = Integer.parseInt(s)
       total += value;
       if(value > max){
            maxcount = 0;
            max = value;
       } else (value == max){
            maxcount++;

       } else if(value < min){
           mincount = 0; 
           min = value;
       } else if(value == min)
           mincount++;
    } 
}

 

Tror dette skulle fungere. Mulig at noe der ikke er riktig, har ikke testet koden.

Endret av Toddy
Lenke til kommentar

Jeg har rettet opp noen syntax feil som jeg fant, men får fortsatt en feilmelding:

 

Exception in thread "main" java.lang.NumberFormatException: For input string: ""

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at Test2.main(Test2.java:23)

 

Her er koden som jeg har nå:

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test2 {

public static void main(String[] args) throws IOException {
 
 BufferedReader in
   = new BufferedReader(new FileReader("Datafil"));
 String line = "";
 int lineCount = 0;
 int total = 0;
 int max = Integer.MIN_VALUE;
 int maxCount = 0;
 int min = Integer.MAX_VALUE;
 int minCount = 0;
 int value;
 while (line != null){
     line = in.readLine();
     lineCount++;
     for (String s : line.split(" ")){ //En eller annen regex kombinasjon
        value = Integer.parseInt(s);
        total += value;
        if(value > max){
             maxCount = 0;
             max = value;
        } else if (value == max){
             maxCount++;

        } else if(value < min){
            minCount = 0;
            min = value;
        } else if(value == min)
            minCount++;
     }
 }
 
 //Skriver ut resultatene
 System.out.println(lineCount + total + maxCount + minCount);
 System.out.println("Antall linjer: " + lineCount);
 System.out.println("Sum: " + total);
 System.out.println("Største tallet: " + max + "Antall ganger: " + maxCount);
 System.out.println("Minste tallet: " + min + "Antall ganger: " + minCount);

}

}

Lenke til kommentar

Ja, feilen ligger på den linjen value=Integer.parseInt(s).

 

Jeg forsøkte å bruke s.equals, men fikk samme feilen.

Her er koden:

for (String s : line.split(" ")){ //En eller annen regex kombinasjon
        s.equals(s);
        value = Integer.parseInt(s);
        total += value;

 

Kan det skrives slik?

Lenke til kommentar

nei... s.equals er tilsvarnde s ==, og kan brukes slik:

 

if(!s.equals("")){
   value = Integer.parseInt(s);
   total += value;
}

 

Da kjører du koden din så lenge s ikke er tom. bør også ha med noe som catcher feilmeldingen som vil komm om s ikke kan parses til et tall, hvis det feks er et ord. og så kan det være lurt å gi en feilmelding om s er tom, hvis ikke du vet at det kun skjer feks helt til slutt i fila.

Lenke til kommentar

Ok, har skrevet dette inn i koden, men får nå feilmeldingen: "The local variable value may not have been initialized.

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test2 {

public static void main(String[] args) throws IOException {
 
 BufferedReader in
   = new BufferedReader(new FileReader("Datafil"));
 String line = "";
 int lineCount = 0;
 int total = 0;
 int max = Integer.MIN_VALUE;
 int maxCount = 0;
 int min = Integer.MAX_VALUE;
 int minCount = 0;
 int value;
 while (line != null){
     line = in.readLine();
     lineCount++;
     for (String s : line.split(" ")){ //En eller annen regex kombinasjon
     	if(!s.equals("")){
          value = Integer.parseInt(s);
          total += value;
     	}
     	else if(value > max){
             maxCount = 0;
             max = value;
        } else if (value == max){
             maxCount++;

        } else if(value < min){
            minCount = 0;
            min = value;
        } else if(value == min)
            minCount++;
     }
 }
 
 //Skriver ut resultatene
 System.out.println(lineCount + total + maxCount + minCount);
 System.out.println("Antall linjer: " + lineCount);
 System.out.println("Sum: " + total);
 System.out.println("Største tallet: " + max + "Antall ganger: " + maxCount);
 System.out.println("Minste tallet: " + min + "Antall ganger: " + minCount);

}

}

 

Alle Value variablene er altså ikke blitt initialisert..Dette du mente om å "catche" feilmeldingen senere? Forstår ikke det helt der så... :/

Endret av eXeCuter_
Lenke til kommentar

problemet du får nok kommer av at du sjekekr om s er tom, hvis ikke så setter du value = Integer..... problemet kommer et par linjer lenger ned: else if(value > max){

 

Der sier du "hvis s ikke er tom, gjør dette, hvis ikke gjør dett". Altså, hvis s er tom sjekker du om value > max. Det kan du ikke gjøre, siden value da ikke er satt.

 

if(!s.equals("")){
       value = Integer.parseInt(s);
       total += value;
     
       if(value > max){
           maxCount = 0;
           max = value;
       } else if (value == max){
            maxCount++;

       } else if(value < min){
          minCount = 0;
          min = value;
       } else if(value == min)
          minCount++;
       }
else{
       // Her skriver du en eller annen feil som sier at linja var tom.
}

 

Alle Value variablene er altså ikke blitt initialisert..Dette du mente om å "catche" feilmeldingen senere? Forstår ikke det helt der så... :/

 

nei, catche gjør du på selve parsingen

 

try{
   value = Integer.parseInt(s);
}
catch(NumberFormatException e){
   System.out.println("S er ikke ett tall!");
}

 

Når jeg tenker meg litt om, så kunne du slupper den s.equals, og bare puttet alt inne i en try/catch. da vil du få en feilmelding på alt som ikke kan parses til int, også hvis s er en tom string.

Lenke til kommentar

Nå har jeg redigert filen litt, og fått inn det som trengs håper jeg.. Men jeg får fortsatt en feilmelding på denne linjen: value = Integer.parseInt(s);

 

Hele feilmeldingen er:

Exception in thread "main" java.lang.NumberFormatException: For input string: " "

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at Test2.main(Test2.java:24)

 

Koden ser nå slik ut:

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test2 {

public static void main(String[] args) throws IOException {
 
 BufferedReader in
   = new BufferedReader(new FileReader("Datafil"));
 String line = "";
 int lineCount = 0;
 int total = 0;
 int max = Integer.MIN_VALUE;
 int maxCount = 0;
 int min = Integer.MAX_VALUE;
 int minCount = 0;
 int value;
 while (line != null){
     line = in.readLine();
     lineCount++;
     for (String s : line.split("")){ //En eller annen regex kombinasjon
     	if(!s.equals("")){
             value = Integer.parseInt(s);
             total += value;
           
             if(value > max){
                 maxCount = 0;
                 max = value;
             } else if (value == max){
                  maxCount++;

             } else if(value < min){
                minCount = 0;
                min = value;
             } else if(value == min)
                minCount++;
             }
     	else{
            System.out.println("Linjen var tom");
     	}
     	try{
          value = Integer.parseInt(s);
       }
       catch(NumberFormatException e){
          System.out.println("S er ikke ett tall!");
       }
     }
     
     
 
 //Skriver ut resultatene
 System.out.println("Antall linjer: " + lineCount);
 System.out.println("Sum: " + total);
 System.out.println("Største tallet: " + max + "Antall ganger: " + maxCount);
 System.out.println("Minste tallet: " + min + "Antall ganger: " + minCount);

}
}
}

 

Før feilmeldingen får jeg "Linjen var tom" og "S er ikke ett tall!"

Endret av eXeCuter_
Lenke til kommentar
Nå har jeg redigert filen litt, og fått inn det som trengs håper jeg.. Men jeg får fortsatt en feilmelding på denne linjen: value = Integer.parseInt(s);

 

Hele feilmeldingen er:

        Exception in thread "main" java.lang.NumberFormatException: For input string: " "

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at Test2.main(Test2.java:24)

 

Koden ser nå slik ut:

 

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test2 {

public static void main(String[] args) throws IOException {
 
 BufferedReader in
   = new BufferedReader(new FileReader("Datafil"));
 String line = "";
 int lineCount = 0;
 int total = 0;
 int max = Integer.MIN_VALUE;
 int maxCount = 0;
 int min = Integer.MAX_VALUE;
 int minCount = 0;
 int value;
 while (line != null){
     line = in.readLine();
     lineCount++;
     for (String s : line.split("")){ //En eller annen regex kombinasjon
     	if(!s.equals("")){
             value = Integer.parseInt(s);
             total += value;
           
             if(value > max){
                 maxCount = 0;
                 max = value;
             } else if (value == max){
                  maxCount++;

             } else if(value < min){
                minCount = 0;
                min = value;
             } else if(value == min)
                minCount++;
             }
     	else{
            System.out.println("Linjen var tom");
     	}
     	try{
          value = Integer.parseInt(s);
       }
       catch(NumberFormatException e){
          System.out.println("S er ikke ett tall!");
       }
     }
     
     
 
 //Skriver ut resultatene
 System.out.println("Antall linjer: " + lineCount);
 System.out.println("Sum: " + total);
 System.out.println("Største tallet: " + max + "Antall ganger: " + maxCount);
 System.out.println("Minste tallet: " + min + "Antall ganger: " + minCount);

}
}
}

 

Før feilmeldingen får jeg "Linjen var tom" og "S er ikke ett tall!"

5152459[/snapback]

 

 

her er koden som fungerer

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test2 {

       public static void main(String[] args) throws IOException {
               BufferedReader in
                       = new BufferedReader(new FileReader("Datafil"));
               String line = "";
               int lineCount = 0;
               int total = 0;
               int max = Integer.MIN_VALUE;
               int maxCount = 0;
               int min = Integer.MAX_VALUE;
               int minCount = 0;
               int value;
               line = in.readLine();
               while (line != null){
                       lineCount++;
                       for (String s : line.split(" ")){ //En eller annen regex kombinasjon
                               if(!s.equals("")){
                                       value = Integer.parseInt(s);
                                       total += value;
                                       if(value > max){
                                               maxCount = 0;
                                               max = value;
                                       } else if (value == max){
                                               maxCount++;
                                       } else if(value < min){
                                               minCount = 0;
                                               min = value;
                                       } else if(value == min)
                                minCount++;
                               }
                               else{
                                       System.out.println("Linjen var tom");
                               }
                               try{
                                       value = Integer.parseInt(s);
                               }
                               catch(NumberFormatException e){
                                       System.out.println("S er ikke ett tall!");
                               }
                               line = in.readLine();
                       }

                       //Skriver ut resultatene
                       System.out.println("Antall linjer: " + lineCount);
                       System.out.println("Sum: " + total);
                       System.out.println("Største tallet: " + max + "Antall ganger: " + maxCount);
                       System.out.println("Minste tallet: " + min + "Antall ganger: " + minCount);

               }
       }
}

 

Legg merke til at en eller annen regex i dette tilfellet er " " dvs at tallene i fila skilles med mellomrom

Endret av Toddy
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...