Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java ja Stringit

Sivun loppuun

kpzpt [17.06.2008 20:12:57]

#

Moi!

Kohteena .SVG file.

mikä olisi paras tapa purkaa path.


esim

d="M 177.82632,71.015479 C 181.42332,71.015479 213.80032,47.032781 266.56332,44.634381 C 338.51132,36.240381 368.49032,83.006879 368.49032,83.006879 C 366.09232,89.002579 417.65432,45.833481 447.63332,49.430881 C 480.01032,54.227481 493.20132,68.616979 489.60332,98.595479 C 487.20532,117.78218 466.81932,126.17618 462.02332,135.76918 C 464.42132,140.56518 490.80232,156.15518 490.80232,198.12518 C 490.80232,240.09518 464.42132,262.87818 465.62032,262.87818 C 466.81932,262.87818 492.00132,304.84818 472.81532,330.03018 C 453.62932,355.21218 399.66732,331.23018 391.27332,326.43318 C 382.87932,328.83118 358.53577,390.73563 252.6791,395.53263 C 165.34328,395.53263 124.54635,357.26967 119.02784,339.52768 C 104.63784,349.12068 62.708521,363.60718 43.522121,327.63218 C 27.933311,282.06518 51.916221,271.27218 56.712721,262.87818 C 51.916221,252.08618 36.327321,234.09918 38.725621,200.52318 C 38.725621,157.35318 49.517921,135.76918 59.111121,128.57418 C 54.314521,118.98118 35.128221,80.608279 77.098121,56.625781 C 146.64832,38.638581 176.62732,72.214679 177.82632,71.015479 z"

ei aikasempaa näin mittavaa kokemusta Java stringeistä..

kuinka poimin floatit tuosta string pathista..

//----

kiitos,,

Sami [17.06.2008 20:42:05]

#

java.util.Scanner auttanee.

Muitakin tapoja tietysti on, mutta tässä on yksi mahdollisuus.

Esimerkiksi noiden taulukoiden(?) parsimiseen saattaisi kannattaa tehdä oma metodinsa, eikä tehdä niin kuin tässä, eli käyttää erotinmerkkinä joko välilyöntiä tai pilkkua. Tässä tällä tuskin on väliä, kun kaikkien taulukoiden koko lienee kiinteä 2*3, mutta jos niiden koko voi olla muutakin, niin silloin sillä on merkitystä.
Ja tietysti virheenkäsittelykin pitää muistaa, vaikka tässä sitä ei olekaan...

public static void parse(String data) {
	Scanner s = new Scanner(data);

	s.useLocale(new Locale("en"));
	s.useDelimiter("[ ,]+");

	while (s.hasNext()) {
		char c = s.next().charAt(0);
		System.out.println(c);
		switch (c) {
			case 'C':
				float[][] Cdata = new float[3][2];
				for (int i = 0; i < Cdata.length; ++i) {
					for (int j = 0; j < Cdata[i].length; ++j) {
						Cdata[i][j] = s.nextFloat();
						System.out.println(Cdata[i][j]);
					}
				}
				break;

			case 'M':
				float[] Mdata = new float[2];
				for (int i = 0; i < Mdata.length; ++i) {
					Mdata[i] = s.nextFloat();
					System.out.println(Mdata[i]);
				}
				break;

			// Ja käsittely myös muille tapauksille ja noille parsituille datoille
		}
	}
}

kpzpt [17.06.2008 21:07:26]

#

Hei!

Kiitos kun vastasit,

tässä on tämän hetkinen ongelmani, ekat lookit scanneriin,
ei koulutettua tuntemusta Javasta,

Scanner s = new Scanner("fadsf 10.10 f83");

tota 10.10 yritän tulostaa alla olevalla koodilla,

float Cdata1 = s.nextFloat();
System.out.println(Cdata1);

antaa seuraavaa ->

Exception in thread "main" java.util.InputMismatchException
        at java.util.Scanner.throwFor(Scanner.java:840)
        at java.util.Scanner.next(Scanner.java:1461)
        at java.util.Scanner.nextFloat(Scanner.java:2319)
        at svg_reader.Maino.Parse(Maino.java:142)
        at svg_reader.Maino.<init>(Maino.java:88)
        at svg_reader.Maino.main(Maino.java:199)

Sami [17.06.2008 22:04:59]

#

Scanner pilkkoo tuon syötteen erotinmerkkijonon kohdalta paloihin ja nuo next*()-metodit palauttavat seuraavan palasen tuosta ja muuttavat sen halutun tyyppiseksi. Jos muunnos ei kuitenkaan onnistu (koska muunnettava merkkijono ei ole oikean tyyppinen), niin tulee tuo poikkeus.

Esim. tuossa koodinpätkässäsi s.nextFloat(); (olettaen että et ole tuossa välissä tehnyt mitään muuta) lukee scannerista merkkijonon "fadsf" ja yrittää muuttaa sitä floatiksi, jota se kuitenkaan ei ole.


Helppo tapa tarkistaa minkälaisiin paloihin tuo Scanner oikein pilkkoo sen syötteeksi saamansa tekstin on seuraava:

public static void splat(String merkkijono) {
  Scanner s = new Scanner(merkkijono);
  while (s.hasNext()) {
    System.out.println(s.next());
  }
}

Eli ylläoleva koodinpätkä yksinkertaisesti tulostaa s.next()-metodin palauttamia merkkijonoja niin kauan kuin niitä riittää (eli kunnes merkkijono loppuu kesken).

Esimerkiksi splat("fadsf 10.10 f83"); tuloste olisi seuraava:

fadsf
10.10
f83

kpzpt [18.06.2008 13:21:14]

#

Hei!

Kiitos, s.next() on ratkaisu,

vielä yksi kysymys, kun en stringejä tunne, sitten 90 luvun alun pascalin..

millä tavalla minä sitten tuon s.next() 10.10 stringin muutan floatiksi..

//----

kiitos,

pr0l3 [18.06.2008 13:32:53]

#

kpzpt kirjoitti:

Hei!

Kiitos, s.next() on ratkaisu,

vielä yksi kysymys, kun en stringejä tunne, sitten 90 luvun alun pascalin..

millä tavalla minä sitten tuon s.next() 10.10 stringin muutan floatiksi..

//----

kiitos,

javasciptissä parseFloat kerro mitä javaa käytät?

kpzpt [18.06.2008 14:15:08]

#

Moi!

Mulla on Sun Java 1.6.0.06 JDK, Ubuntu 8.04 ssä ja tuntuu toimivan hienosti..

Mikäs tuo Javascipti on, eli mistä tuo parseFloat löytyy, String käyty läpi
viimeksi Pascalissa 90 luvun alussa..


//----

kiitos,,

Blaze [18.06.2008 14:20:10]

#

Javalla ja Javaskriptillä on nimen lisäks melko vähän yhteistä, mutta parseFloat molemmista löytyy: http://java.sun.com/javase/6/docs/api/java/lang/Float.html#parseFloat(java.lang.String)

Sami [18.06.2008 17:29:01]

#

Float.parseFloat(String) yrittää muuttaa annetun merkkijonon floatiksi.
Jos tiedät että sieltä scannerista pitäisi olla putkahtamassa float, niin parempi tapa on käyttää suoraan Scannerin nextFloat()-metodia.

kpzpt [18.06.2008 21:09:29]

#

Hei!

Vielä yksi kysymys niin kaikki on selvillä kääntöä varten..

mulla on stringissä 400px ni kuinka mä scannerilla tiputan ton
px ( pixel ) pois tosta 400 takaa..

s.useDelimiter("[ ,.;:#\"]+");

käytössä ja tuo jakaa kaikki muut osaset tosta .svg fileestä, paitsi ton pixeli päätteen px..

//----

kiitos,,

kpzpt [19.06.2008 13:32:00]

#

Hei!

No niin nyt Stringien käsittely onnistuu täysin..

purin ton 400px tupla skannuksella,

ensin skannaan width ja height stringit ja niitten jälkeen s.nextFloat(),

s.useDelimiter("[ p,.;:#\"]+");

huomaa tuo p tuossa limiterissä, ni sitten tuo 400 löytyy Floattina..

tämän ekan skannin jälkeen skannaan Curvet ja Movet Pathista ja niitten asetukset..

ja tämän jälkeen vain piirrän ne..

//----

kiitos,,


Sivun alkuun

Vastaus

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

Tietoa sivustosta