Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Java] Regels lezen uit files

Pagina: 1
Acties:

  • GLaDOS
  • Registratie: December 2012
  • Laatst online: 30-09 10:06
Hallo Tweakers,

Ik ben bezig met een opdracht maar kom niet verder omdat ik gewoonweg niet weet in welke richting ik moet zoeken. Mijn medestudenten vieren vakantie en bieden dus ook geen/weinig hulp. Ik hoop dat iemand mij hier kan helpen het probleem op te lossen.

Ik heb de opdracht een programmaatje te maken dat tekst leest uit een bestand en de volgende mogelijkheden biedt:
a) dat de naam afdrukt van het duurste vuurwerk.
b) en de vuurwerknaam van het meest populaire vuurwerk.

Het bestand waar uit gelezen moet worden is als volgt opgebouwt:
 eerst de naam,
 dan een puntkomma en een spatie,
 dan de prijs (een double-getal),
 dan weer een puntkomma en een spatie,
 en tenslotte de score (een int-getal).
De score geeft de populariteit aan (het populairste vuurwerk heeft een score 20).

In het bestand staat het volgende:
Strijker; 12.95; 13
Bommetje; 6.75; 8
Klapper; 1.75; 2

Ik ben al in staat de regels te lezen met de volgende code:

[code=java]import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Main {

public static void main(String[] args) throws IOException {
File f = new File("vuurwerk.txt");
if (f.exists() && f.isFile()) {
Scanner sc = new Scanner(f);
sc.useDelimiter("\n");
while (sc.hasNext()) {
String s = sc.next();
System.out.println("" + s);
}
sc.close();
}
}
}[/code=java]

De output is dan als volgt:

[code=output]Strijker; 12.95; 13

Bommetje; 6.75; 8

Klapper; 1.75; 2[/code=output]

Hoe kom ik nu verder? Kan iemand mij helpen in de juiste richting te zoeken? Bij voorbaat dank

[ Voor 187% gewijzigd door GLaDOS op 02-01-2013 13:55 ]


  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

je kunt ook gewoon je ts gaan aanpassen naar wat het wel moet zijn?

  • GLaDOS
  • Registratie: December 2012
  • Laatst online: 30-09 10:06
Mee bezig :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
[google=java string split]
[google=java parse double]
[google=java parse int]

[ Voor 19% gewijzigd door RobIII op 02-01-2013 14:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Ik denk dat je een object vuurwerk wilt maken waar je de info in opslaat en vervolgens het object in een lijst opslaan om die vervolgens te doorzoeken. Hiervoor moet je de regel zelf ook gaan parsen, maar dat kan met een stringtokenizer heel makkelijk.

[ Voor 28% gewijzigd door Gropah op 02-01-2013 14:07 ]


  • GLaDOS
  • Registratie: December 2012
  • Laatst online: 30-09 10:06
Opgelost bedankt voor de hulp!

  • GLaDOS
  • Registratie: December 2012
  • Laatst online: 30-09 10:06
Hoi ik ben een enorm eind verder gekomen met een wat ander aanpak. De code die ik nu gebruik is als volgt:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws IOException {
        
        String populairste = "niets";
        String duurste = "niets";
        double hoogsteprijs = 0.00;
        int hoogstepop = 0;

        FileReader fr = new FileReader("vuurwerk.txt");
        BufferedReader br = new BufferedReader(fr);

        while (true) {
            String regel = br.readLine();
            System.out.println(regel);
            if (regel == null) {
                break;
            }
            Scanner sc = new Scanner(regel);
            sc.useDelimiter("\\s*;\\s*");
            String nm = sc.next();
            double pr = Double.parseDouble(sc.next());
            String pop1 = sc.next();
            int pop2 = Integer.parseInt(pop1);

            if (pr > hoogsteprijs) {
                populairste = nm;
                hoogsteprijs = pr;
            }
            if (pop2 > hoogstepop) {
                duurste = nm;
                hoogsteprijs = pop2;
            }
            sc.close();
            

        }
        br.close();
        System.out.println(duurste + " is het duurste");
        System.out.println(populairste + "is het populairst");

    }

}


Dit geeft de volgende error:

code:
1
2
3
4
5
Exception in thread "main" java.lang.NumberFormatException: For input string: "2    "
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Main.main(Main.java:29)


Hij heeft om de een of andere reden problemen met mijn parseInt en ik kan er niet achterkomen wat het is. Is er iemand die mij weer een zetje in de goede richting kan geven?

  • Puc van S.
  • Registratie: Maart 2002
  • Laatst online: 21-11 15:40
code:
1
"2    "


iets zegt mij dat daar teveel spaties in staan...

[ Voor 9% gewijzigd door Puc van S. op 02-01-2013 16:52 ]

[http://www.okbreijnen.nl] [Overwatch] [Cennahysh]


  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Sowieso even een paar opmerkingen.

Dit programma zal nooit eindigen doordat je een while(true) gebruikt. Daarnaast zou ik de FileReader niet in een bufferedReader stoppen, maar in een scanner. Dan kun je namelijk veel makkelijker checken of er nog een volgende regel is (handig voor de while lus). Ook wil ik nog zeggen: double != Double in java.

Vervolgens kun je mbv de scanner dus een aparte regel opvragen en die laten parsen, waarvoor een aparte functie wel zo handig is. Zie aub ook mijn eerste post over een stringtokenizer voor het parsen van een zin.

[ Voor 4% gewijzigd door Gropah op 02-01-2013 17:04 ]


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:23

Creepy

Tactical Espionage Splatterer

Gropah schreef op woensdag 02 januari 2013 @ 16:55:
Sowieso even een paar opmerkingen.

Dit programma zal nooit eindigen doordat je een while(true) gebruikt.
Beter lezen ;) Er staat een break in die ervoor zorgt dat de loop wordt gestopt indien er niks meer gelezen kan worden
Daarnaast zou ik de FileReader niet in een bufferedReader stoppen, maar in een scanner. Dan kun je namelijk veel makkelijker checken of er nog een volgende regel is (handig voor de while lus).
Wat ook prima nu kan door boven de loop de eerste regel te lezen en in de while te checken op null
Java:
1
2
3
4
5
6
BufferedReader br = new BufferedReader(fr); 
String regel = br.readLine(); 
while (regel != null) { 
 ....
  regel = br.readLine()
}
Ook wil ik nog zeggen: double != Double in java.
Standaard heeft een Double.parseDouble een double terug volgens de javadoc
Vervolgens kun je mbv de scanner dus een aparte regel opvragen en die laten parsen, waarvoor een aparte functie wel zo handig is. Zie aub ook mijn eerste post over een stringtokenizer voor het parsen van een zin.
Met de buffered reader lees je al direct per regel, daar heb je de scanner dus niet voor nodig.

[ Voor 11% gewijzigd door Creepy op 02-01-2013 17:28 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • GLaDOS
  • Registratie: December 2012
  • Laatst online: 30-09 10:06
Ik ben het eens dat wat ik heb gemaakt niet echt geweldig is. Het is alleen zo dat de docent die mij deze opdracht geeft bepaalde dingen die hij behandeld heeft wil terug zien. Ik ben dus gedwongen bepaalde dingen te gebruiken :(

  • GLaDOS
  • Registratie: December 2012
  • Laatst online: 30-09 10:06
Puc van S. schreef op woensdag 02 januari 2013 @ 16:52:
code:
1
"2    "


iets zegt mij dat daar teveel spaties in staan...
Ah bedankt ik kom er nu achter dat er inderdaad een tabje in de textfile stond. Deze haalde de delimiter er niet uit!

  • GLaDOS
  • Registratie: December 2012
  • Laatst online: 30-09 10:06
Soms kun je je doodstaren op zulke kleine foutjes. Bedankt voor alle hulp!

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 21:34

steveman

Comfortabel ten onder

Je kunt trim() aanroepen op een String om eventuele spaties er om heen weg te halen: " hoi ".trim() --> "hoi"

nm = nm.trim(); bijvoorbeeld.

(Geen idee of je het tekstbestand aan mag passen)

[ Voor 15% gewijzigd door steveman op 03-01-2013 00:01 ]

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
steveman schreef op donderdag 03 januari 2013 @ 00:00:
Je kunt trim() aanroepen op een String om eventuele spaties er om heen weg te halen: " hoi ".trim() --> "hoi"

nm = nm.trim(); bijvoorbeeld.

(Geen idee of je het tekstbestand aan mag passen)
Let er wel op dat je hiermee actief de input aanpast en dat dat lang niet altijd gewenst zal zijn.

Zo had ik vroeger een leraar die voor de gein een aantal waardes rechts uitvulde met spaties en een aantal niet. En dan moest je alle unieke records totaliseren. Als je dan trim gebruikte dan zat je fout. En als iedereen dat geintje doorhad dan was de volgende opgave dat je alle unieke word-delimited records moest totaliseren ;)

  • Ozzie
  • Registratie: Februari 2004
  • Laatst online: 20:54
Ik zou zelf voor een object-georiënteerde oplossing gaan. Zeker omdat je in dit geval Java moet gebruiken ga ik er ook vanuit dat school verwacht dat je OOP programmeert, maar misschien is dat een verkeerde aanname.

Je zou een 'Vuurwerk'-object kunnen maken met de eigenschappen: naam, prijs en populariteit. Bij het parsen van een regel uit je bestandje zet je die dan in een vuurwerk object. Voor elke regel stop je een nieuw vuurwerk object in een List.

Vervolgens kan je op verschillende manieren de gewenste resultaten uit de lijst halen. Ik zou zelf denk gebruik maken van Collections.sort en dan per case een Comparator implementeren die op de juiste manier de objecten vergelijkt.

"Write code as if the next maintainer is a vicious psychopath who knows where you live."


  • bwerg
  • Registratie: Januari 2009
  • Niet online

bwerg

Internettrol

Ozzie schreef op donderdag 03 januari 2013 @ 14:56:
Je zou een 'Vuurwerk'-object kunnen maken met de eigenschappen: naam, prijs en populariteit. Bij het parsen van een regel uit je bestandje zet je die dan in een vuurwerk object. Voor elke regel stop je een nieuw vuurwerk object in een List.
OOP-technisch prima, maar ik zou het niet doen als het niet duidelijk gevraagd werd. Alleen een int zoeken kan ook prima zonder die objecten, zeker aangezien je slechts één stuk vuurwerk hoeft te onthouden per categorie (populariteit en prijs) en een hele lijst aanmaken dus overbodig is. Het netste in OOP-termen zonder overbodige dingen te onthouden is dus één stuk vuurwerk, waar je een die int-waardes in doet, en aan het einde haal je die int-waarde er weer uit. Dan kun je net zo goed dat hele object weglaten. Of je moet aan het einde ook de naam willen laten zien, dan is het wel netjes.
Vervolgens kan je op verschillende manieren de gewenste resultaten uit de lijst halen. Ik zou zelf denk gebruik maken van Collections.sort en dan per case een Comparator implementeren die op de juiste manier de objecten vergelijkt.
Zelfde geldt daarvoor, sorteren is overbodig veel werk als je alleen het maximum wilt (zowel qua implementatie als runtime, hoewel dat laatste natuurlijk verwaarloosbaar is maar uit didactisch oogpunt is de runtime-performance altijd handig om in het achterhoofd te hebben).

Heeft geen speciale krachten en is daar erg boos over.


  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Maar je wilt eigenlijk een systeem maken wat makkelijk uit te breiden is. Hoe je zoiets maakt moet je ook leren. Ikzelf prefereer dan ook om de meest flexibele oplossing mogelijk te maken. Dit zorgt over het algemeen voor iets meer werk, maar het is makkelijker aan te passen voor toekomstig gebruik bij iets en het is gewoon overall netter.

De aanname dat omdat je met Java werkt, het ook OOP moet is btw een zeer slechte. Tot 2 jaar terug werd op de RUG in het eerste kwartaal imperatief programmeren (dus 1 grote file met daarin alle code) gewoon gedaan met Java. Ze zijn er van af gestapt omdat er te veel ingebouwd zat en ze vonden dat je de meeste basale dingen ook wel zelf moest kunnen en de taal er eigenlijk ook niet zo voor bedoeld is. (Tegenwoordig wordt het vak in C gegeven.) Het punt is dus, dat als een taal bedoeld is om op een bepaalde manier te gebruiken, het nog niet altijd zo gebeurd.

  • Ozzie
  • Registratie: Februari 2004
  • Laatst online: 20:54
Gropah schreef op donderdag 03 januari 2013 @ 16:07:
De aanname dat omdat je met Java werkt, het ook OOP moet is btw een zeer slechte. Tot 2 jaar terug werd op de RUG in het eerste kwartaal imperatief programmeren (dus 1 grote file met daarin alle code) gewoon gedaan met Java.
Vandaar dat ik er al bij zei dat het misschien een verkeerde aanname was, maar ik vind het wel erg vreemd van een hogeschool/universiteit dat ze voor niet object georienteerde programmeer vakken wel een pure OO-taal zoals Java gebruiken. Ik zou het dan zelf logischer vinden om een taal als C te geven of misschien zelfs Python zodat je allerlei verschillende paradigma's in dezelfde taal kan toepassen.
Maar ik ben natuurlijk geen onderwijzer dus misschien heb ik het helemaal fout :)

"Write code as if the next maintainer is a vicious psychopath who knows where you live."


  • Devilly
  • Registratie: Januari 2009
  • Niet online
Ozzie schreef op vrijdag 04 januari 2013 @ 11:28:
[...]


Vandaar dat ik er al bij zei dat het misschien een verkeerde aanname was, maar ik vind het wel erg vreemd van een hogeschool/universiteit dat ze voor niet object georienteerde programmeer vakken wel een pure OO-taal zoals Java gebruiken. Ik zou het dan zelf logischer vinden om een taal als C te geven of misschien zelfs Python zodat je allerlei verschillende paradigma's in dezelfde taal kan toepassen.
Maar ik ben natuurlijk geen onderwijzer dus misschien heb ik het helemaal fout :)
Java wijkt natuurlijk in veel meer aspecten van C af dan alleen het paradigma. De argumentatie achter de keuze om Java boven C te kiezen is enorm vaak de abstractielaag waarin het faciliteert. Om dat weg te laten vallen om die paar extra regels code weg te krijgen, lijkt me geen goede keuze.

Bijvoorbeeld Python kiezen lijkt me wel een goede optie. Persoonlijk heb ik ook leren programmeren met Java, maar denk dat ik liever imperatief of functioneel was begonnen. Misschien duurt het dan iets langer voordat je weet wat OOP precies inhoudt, maar daarentegen verwacht ik dat het gemiddelde programmeerniveau in de klas wel hoger zou liggen.

  • Gropah
  • Registratie: December 2007
  • Niet online

Gropah

Admin Softe Goederen

Oompa-Loompa 💩

Ozzie schreef op vrijdag 04 januari 2013 @ 11:28:
[...]


Vandaar dat ik er al bij zei dat het misschien een verkeerde aanname was, maar ik vind het wel erg vreemd van een hogeschool/universiteit dat ze voor niet object georienteerde programmeer vakken wel een pure OO-taal zoals Java gebruiken. Ik zou het dan zelf logischer vinden om een taal als C te geven of misschien zelfs Python zodat je allerlei verschillende paradigma's in dezelfde taal kan toepassen.
Maar ik ben natuurlijk geen onderwijzer dus misschien heb ik het helemaal fout :)
De reden was dat het makkelijker te begrijpen was. Dit omdat er ook vaak genoeg mensen zijn die totaal geen programmeer ervaring hebben als ze op de RUG aankomen (zoals ondergetekende want komop, gamemaker in advanced mode is geen programmeer taal, maar een marteling). Ik kan je zo vertellen dat als ik in java was begonnen ik imperatief programmeren een stuk makkelijker had gevonden, maar ook dat ik een groot stuk kennis had gemist en dat bij andere vakken het voor mij een stuk moeilijker zou zijn geweest. Overall ben ik zelf dan ook wel blij met het feit dat ik nu (een beetje) C kan.

  • steveman
  • Registratie: Mei 2001
  • Laatst online: 21:34

steveman

Comfortabel ten onder

Gomez12 schreef op donderdag 03 januari 2013 @ 00:20:
[...]

Let er wel op dat je hiermee actief de input aanpast en dat dat lang niet altijd gewenst zal zijn.

Zo had ik vroeger een leraar die voor de gein een aantal waardes rechts uitvulde met spaties en een aantal niet. En dan moest je alle unieke records totaliseren. Als je dan trim gebruikte dan zat je fout. En als iedereen dat geintje doorhad dan was de volgende opgave dat je alle unieke word-delimited records moest totaliseren ;)
Fláuw :D

"Take the risk of thinking for yourself. Much more happiness, truth, beauty, and wisdom will come to you that way." -Christopher Hitchens | In memoriam? 🏁 ipv kruis!

Pagina: 1