Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java String int-tyyppiseksi ja arvon fiksailu

Belaeryth [02.02.2007 00:53:23]

#

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)

Antti Laaksonen [02.02.2007 09:00:08]

#

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);

anttipanda [02.02.2007 09:20:20]

#

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

Belaeryth [02.02.2007 12:31:41]

#

Kiitoksia kumpaisellekkin.

Käytin tuota merkki kerrallaan -ratkaisua ja osoittautui oikeinkin hyvin toimivaksi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta