Vraag & Antwoord

Programmeren

[java] een string parsen

10 antwoorden
  • 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
  • Volgens mij hebben ze daar Regular Expressions voor uitgevonden ;) Zit geloof ik sinds 1.4 eindelijk in de JDK...
  • 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.
  • java.util.StringTokenizer
  • 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.
  • 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
  • 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!"); } } } }
  • 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]
  • 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
  • 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

Beantwoord deze vraag

Weet jij het antwoord op deze vraag? Registreer of meld je aan met je account

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.