anoniem Geplaatst: 23 juni 2002 Delen Geplaatst: 23 juni 2002 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 Quote Link naar reactie
anoniem Geplaatst: 23 juni 2002 Auteur Delen Geplaatst: 23 juni 2002 Volgens mij hebben ze daar Regular Expressions voor uitgevonden ;) Zit geloof ik sinds 1.4 eindelijk in de JDK... Quote Link naar reactie
anoniem Geplaatst: 23 juni 2002 Auteur Delen Geplaatst: 23 juni 2002 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. Quote Link naar reactie
anoniem Geplaatst: 25 juni 2002 Auteur Delen Geplaatst: 25 juni 2002 java.util.StringTokenizer Quote Link naar reactie
anoniem Geplaatst: 25 juni 2002 Auteur Delen Geplaatst: 25 juni 2002 Dat van cim zal ongetwijfeld ook werken, maar Bill heeft ook gelijk. Wat zou je eraan hebben om een string alleen te 'beschrijven' ? Je 'beschrijft' hem om er vervolgens iets mee te doen. Quote Link naar reactie
anoniem Geplaatst: 27 juni 2002 Auteur Delen Geplaatst: 27 juni 2002 herman777 heeft gelijk, dat is inderdaad de bedoeling. Als je er even naar kijken wilt, graag. Doe niet te veel moeite, het gaat om het principe, een aanwijzing in de goede richting volstaat ook. Tnx, Haike Quote Link naar reactie
anoniem Geplaatst: 30 juni 2002 Auteur Delen Geplaatst: 30 juni 2002 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!"); } } } } Quote Link naar reactie
anoniem Geplaatst: 1 juli 2002 Auteur Delen Geplaatst: 1 juli 2002 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] Quote Link naar reactie
anoniem Geplaatst: 2 juli 2002 Auteur Delen Geplaatst: 2 juli 2002 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 Quote Link naar reactie
anoniem Geplaatst: 2 juli 2002 Auteur Delen Geplaatst: 2 juli 2002 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 Quote Link naar reactie
anoniem Geplaatst: 2 juli 2002 Auteur Delen Geplaatst: 2 juli 2002 [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. Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen