Ga naar inhoud

[java] een string parsen


Aanbevolen berichten

Hoi, voor een programma moet ik strings van de volgende vorm parsen: ---String----- [getal]['x'/'-'][getal] ---/String---- Dit houdt dus in: de string begint met een getal van 1 of 2 decimalen. Gevolgde door een "x" of een "-" teken. Tenslotte volgt nog een getal van 1 of 2 decimalen. Ik wil de getallen als twee integers krijgen. (het gaat om een notatie van een zet uit een bordspelletje) Iemand een idee voor een opzet? Haike
Link naar reactie
ehm...wablief? reguliere expressies zijn toch manieren om een beschrijving te geven van een string? Ik wil gewoon de elementen eruit halen. Ik heb al wat geprobeert met een string.toCharArray en dan een lusje door de array heen. In de API staat bij "character" dat je een "isDigit" kan aanroepen, maar de compiler vindt van niet. Daarom zoek ik een andere methode.
Link naar reactie
Haite. hier een StringParser voor jouw probleem, met een testclass erbij. Haalt alleen de eerste 2 cijfers als integer terug, de 2e 2 cijfers mag je zelf doen! Helaas raakt de layout een beetje verminkt door het versturen. succes, Herman package nl.test; public class HaitesStringParser { private String[] geldige_cijfers = {"0","1","2","3","4","5","6","7","8","9"}; private String[] geldige_scheidingstekens = {"x", "-"}; public int getFirstInteger(String s){ //eerst wat variabelen declareren en initaliseren boolean eerste_cijfer_gevonden = false; boolean tweede_cijfer_gevonden = false; boolean scheidingsteken_gevonden = false; int teruggeven = -1; int teller=0; //Bekijk wat er op positie 1 staat //Wat daar staat moet voorkomen in de array geldige_scheidingstekens //NB: java noemt het de eerste positie element 0 //Je wilt 1 element van positie 0, vandaar de (0,1) String op_positie1 = s.substring(0,1); for (teller=0;teller<geldige_cijfers.length; teller++){ if (op_positie1.equals(geldige_cijfers[teller])){ eerste_cijfer_gevonden = true; } } //als op de 1e positie geen getal stond dan houden we er mee op if(eerste_cijfer_gevonden == false){ System.out.println("Op positie 1 staat: " + op_positie1); return teruggeven; } //op positie 2 mag een cijfer staan of een scheidingsteken String op_positie2 = s.substring(1,2); for (teller=0;teller<geldige_cijfers.length; teller++){ if (op_positie2.equals(geldige_cijfers[teller])){ tweede_cijfer_gevonden = true; } } //indien op positie 2 geen cijfer, dan misschien een scheidingsteken? for (teller=0;teller<geldige_scheidingstekens.length; teller++){ if (op_positie2.equals(geldige_scheidingstekens[teller])){ scheidingsteken_gevonden = true; } } //als er op positie 2 geen cijfer en geen scheidingsteken stond dan houden we er mee op if((tweede_cijfer_gevonden == false)&&(scheidingsteken_gevonden == false)){ System.out.println("Op positie 2 staat: " + op_positie2); return teruggeven; } //als op positie 2 een scheidingsteken stond dan kunnen we de eerste integer terug geven //Je kunt van een String naar een integer, door met de String eerst een Integer object te maken //Van het Integer object haal je de waarde op, dat is een primitieve integer. if(scheidingsteken_gevonden == true){ Integer i = new Integer(op_positie1); teruggeven = i.intValue(); return teruggeven; } //hier kom je alleen als op positie 1 en positie 2 een getal stond Integer i = new Integer(op_positie1 + op_positie2); teruggeven = i.intValue(); return teruggeven; } public int getSecondInteger(String s){ int i=0; return i; } } package nl.test; public class HaitesStringParserTester { public static void main(String[] args) { String [] testgevallen = {"1x2", "12x3", "02-12", "ax1", "1c1"}; //-1 krijg je terug als het testgeval een fout oplevert int [] verwachte_resultaten = {1, 12, 02, -1, 1}; //de array met gekregen resultaten moet net zo groot zijn als //de array met de verwachte resultaten //we initialiseren deze array met -1. int [] gekregen_resultaten = new int[testgevallen.length]; for (int i=0; i<testgevallen.length; i++){ gekregen_resultaten[i] = -1; } HaitesStringParser hai = new HaitesStringParser(); //we voeren alle testgevallen in 1x uit! for(int teller=0; teller<testgevallen.length; teller ++){ gekregen_resultaten[teller] = hai.getFirstInteger(testgevallen[teller]); if (gekregen_resultaten[teller] != verwachte_resultaten[teller]){ System.out.println("Test nr " + (teller+1) + " is mislukt!"); System.out.println("Verwacht was: " + verwachte_resultaten[teller]); System.out.println("Gekregen werd: " + gekregen_resultaten[teller]); } else{ System.out.println("Test nr " + (teller+1) + " is gelukt!"); } } } }
Link naar reactie
ik had zelf zoiets, weet nog niet of het helemaal werkt: (is iets compacter) [code:1:c7edec38f2] public void parseMove(String move) { StringTokenizer str = new StringTokenizer(move); boolean flag = true; StringBuffer firstNumber = new StringBuffer(""); StringBuffer secondNumber = new StringBuffer(""); int first, second; String op = ""; while(str.hasMoreTokens()) { String t = str.nextToken(); if(isDigit(t)) { if(flag) firstNumber.append(t); else secondNumber.append(t); } if(t=="-"||t=="x") op = t; else break; } first = Integer.parseInt(firstNumber.toString()); second = Integer.parseInt(secondNumber.toString()); dambord.movePiece(first,second,op); } public boolean isDigit(String s) { String nums = "0123456789"; for(int i=0;i<10;i++) { if(nums.substring(i,i+1).equals(s)) return true; } return false; } [/code:1:c7edec38f2]
Link naar reactie
Haite, Blij dat je mijn geploeter hebt gelezen. Jouw code lijkt compacter, maar: -ik zie geen class en ook geen Testclass om jouw code te testen -ik zie geen enkel commentaar: over 1 maand weet jij niet meer wat de variabele "op" voorstelt, en waarschijnlijk ook niet wat "flag" betekent. ik krijg de kriebels bij: if(t=="-"||t=="x") , gebruik a.u.b if(t.equals("-")||t.equals("x")) en liever ook nog met {}. Verderop doe je dat gelukkig wel. -dambord zie ik niet gedefineerd en movepiece() ook niet maar dat zul je elders wel gedaan hebben. Succes! Herman
Link naar reactie
hoi herman, ten eerste is het haike en niet haite.... ten tweede zijn de twee functies maar een onderdeel van een klasse, en in die klasse kun je gemakkelijk een testfunctie schrijven. Het gaat hier om het principe en deze paar regels hebben volgens mij niet veel commentaar nodig. Toch bedankt voor je hulp en ik zal inderdaad een string vergelijking in het vervolg met equals() doen...sorry en ja een enkele regel in een if-statement doe ik meestal zonder accolades en met gewoon een keer inspringen. Maar das mijn smaak. ;) Tot het volgende probleem.... Haike
Link naar reactie
[quote:50a34866a7="zegwaard"] voor een programma moet ik strings van de volgende vorm parsen: ---String----- [getal]['x'/'-'][getal] ---/String---- Dit houdt dus in: de string begint met een getal van 1 of 2 decimalen. Gevolgde door een "x" of een "-" teken. Tenslotte volgt nog een getal van 1 of 2 decimalen. Ik wil de getallen als twee integers krijgen.[/quote:50a34866a7] idd. Reguliere expressies. Als je daar niet iets gautomatiseerd voor heb. Zoek eens op internet naar 'Eindige automaten' of 'Finite State Machines' en maak aan de hand van jouw voorbeeld een schema/tabel en verwerk dit in je programma. of iets versimpeld.. pseudo code... [code:1:50a34866a7] var i: integer; s: string; las: char; gevonden: boolean; Status: integer; Token1, Token2, Token3: string; begin s := Trim('5x6'); Status := 1; i := 0; gevonden := true; Token1 := ''; Token2 := ''; Token3 := ''; while ((gevonden) and (i<Length(s))) do begin i := i +1; las := Chr(Copy(s,i,1)); Select Case las '0'..'9': Select Case Status of 1: Select Case Length(Status1) of 0: Token1 := Token1 + las; 1: Token1 := Token1 + las; Status := 2; else gevonden := false; end; 3: Select Case Length(Status3) of 0: Token3 := Token3 + las; 1: Token3 := Token3 + las; Status := 4; else gevonden := false; end; else gevonden := false; 'x','-': Select Case Status of 2: Token2 := las; Status := 3; else gevonden := false; end; else gevonden := false; end; end; end; [/code:1:50a34866a7] Zo uit m'n hoofd. Zelf ff omzetten en checken. [update] Ik zie dat 'getal' in mijn code uit precies 2 cijfers moet bestaan -> Zelf ff aanpassen.
Link naar reactie

Om een reactie te plaatsen, moet je eerst inloggen

Gast
Reageer op dit topic

×   Geplakt als verrijkte tekst.   Herstel opmaak

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

  • Populaire leden

    Er is nog niemand die deze week reputatie heeft ontvangen.

  • Leden

    Geen leden om te tonen

×
×
  • Nieuwe aanmaken...