eXeCuter_ Skrevet 12. november 2005 Del Skrevet 12. november 2005 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 Lenke til kommentar
Toddy Skrevet 12. november 2005 Del Skrevet 12. november 2005 (endret) 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 12. november 2005 av Toddy Lenke til kommentar
eXeCuter_ Skrevet 13. november 2005 Forfatter Del Skrevet 13. november 2005 Jeg får syntaks feil error on token(s), misplaced contructor(s) på følgende utsagn: { maxcount = 0; max = value; } else (value == max) Lenke til kommentar
Gazette Skrevet 13. november 2005 Del Skrevet 13. november 2005 Jeg får syntaks feil error on token(s), misplaced contructor(s) på følgende utsagn: { maxcount = 0; max = value; } else if(value == max) // <------ manglet en liten if... 5146741[/snapback] Lenke til kommentar
eXeCuter_ Skrevet 14. november 2005 Forfatter Del Skrevet 14. november 2005 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
mikaelandre Skrevet 14. november 2005 Del Skrevet 14. november 2005 hadde jo hjulpet å vite hvilken linje feilen kommer på, men det ser ut som om du prøver å parse "" til int, noe som ikke er mulig... Regner med feilen er her: value = Integer.parseInt(s); før du tar den må du sjekke at s ikke er tom, feks ved s.equals Lenke til kommentar
eXeCuter_ Skrevet 14. november 2005 Forfatter Del Skrevet 14. november 2005 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
mikaelandre Skrevet 14. november 2005 Del Skrevet 14. november 2005 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
eXeCuter_ Skrevet 14. november 2005 Forfatter Del Skrevet 14. november 2005 (endret) 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 14. november 2005 av eXeCuter_ Lenke til kommentar
mikaelandre Skrevet 14. november 2005 Del Skrevet 14. november 2005 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
eXeCuter_ Skrevet 14. november 2005 Forfatter Del Skrevet 14. november 2005 (endret) 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 14. november 2005 av eXeCuter_ Lenke til kommentar
Toddy Skrevet 19. november 2005 Del Skrevet 19. november 2005 (endret) 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 19. november 2005 av Toddy Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå