Teen J2ME mobiilisovellusta, joka piirtää oletuksena ympyrän canvasille ja jää odottamaan tekstiviestiä, jossa määritellään uudet x- ja y-koordinaatit.
Kun tekstiviesti tulee, ohjelma "lukee" viestin ja sen voi tulostaa konsoliin ihan oikein. Ongelmia ilmenee vasta viestin käsittelyssä. Eli koordinaatit pitäisi saada tallennettua xValue ja yValue -muuttujiin int-muodossa.
Tekstiviestissä arvo on String-muodossa xNNNyNNN (N = numero) eli esimerkiksi x100y200.
Olen yrittänyt lähestyä asiaa niin, että luetaan x-kirjaimesta kolme seuraavaa lukua ja talletetaan toiseen muuttujaan (xValue)
xValue = isAValue.substring(isAValue.indexOf("x", 0)+1, isAValue.indexOf("x", 0)+4);
Sitten muutetaan int-tyypiksi Integer.parseInt():llä ja y-koordinaatille sama.
Ongelmia tulee silloin, kun x:n arvo on alle sata (esim. x86y200), jolloin arvo voi olla NNy (86y) ja ohjelma heittää NumberFormatExceptionin kehiin ja ohjelma palaa oletusarvoon. Ongelmia tulee myös silloin, jos x:n arvo on ollut esim. 200 ja lähetetäänkin pienempi arvo, silloin palataan myös oletuksiin.
Mitenkähän tätä voisi lähteä rakentamaan?
(Toivottavasti selitin asian tarpeeksi selkeästi)
Tässä on yksi ratkaisu, joka tutkii merkkijonoa merkki kerrallaan:
String tiedot = "x86y200"; int x = 0, y = 0, tila = 0; for (int i = 0; i < tiedot.length(); i++) { char merkki = tiedot.charAt(i); if (merkki == 'x' && tila == 0) { tila = 1; } else if (merkki == 'y' && tila == 1) { tila = 2; } else if (merkki >= '0' && merkki <= '9') { int numero = (int)(merkki - '0'); if (tila == 1) { x = x * 10 + numero; } else if (tila == 2) { y = y * 10 + numero; } else { System.out.println("VIRHE!"); break; } } else { System.out.println("VIRHE!"); break; } } System.out.println("Luettiin: x = " + x + " ja y = " + y);
Oliskos splittaus x ja y erotiminaan mitään?
Tuohon splitin sisälle pitäisi laittaa regex-lauseke, en ole varma miten se nyt meni. Muistaakseni [xy] tarkoittaa x tai y.
String[] parts = isAValue.split("[xy]"); if( parts.getLength() == 2 ) { xValue = Integer.parseInt(parts[0]); yValue = Integer.parseInt(parts[1]); }
... tai jotain tuohon suuntaan. Kun tarkemmin ajattelee, niin ensimmäinen taulukon alkio on tyhjä, ja toinen ja kolmas sisältää luvut. En ole varma kun java ei ole hallussa :D
Kiitoksia kumpaisellekkin.
Käytin tuota merkki kerrallaan -ratkaisua ja osoittautui oikeinkin hyvin toimivaksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.