» »

[java]parseInt težava

[java]parseInt težava

Zlatan ::

Problem v javi. S Scannerjem sem iz datoteke prebral niz znakov in iz njega izluščil samo številke, tako da izpis izgleda nekak takole:
23  8 546 2 76    29 


Sedaj pa moram te številke seštet. Poskušal sem takole:

while(scan.hasNext())
	{
	vsota = vsota + Integer.parseInt(scan.next());	
	}


javlja pa mi NumberFormatException znotraj zanke. Kaj delam narobe? Kaj nima parseInt() za argument String?:(

urosz ::

imaš String, ki je "23 8 546 2 76 29" ??

če ja, bi jaz s StringTokenizer-jem niz razdelil na več kosov in vsak kos (oz. število) parsal.

BaRtMaN ::

Scanner ima tudi metodo nextInt().

FlashM ::

huh... v javi nisem nikol programiru, ampak glede na to da je bojda zelo podoba C# bi reku da gre nekako takole:


string line;

while ((line = scan.next()) != null)
{
vsota = vsota + Integer.parseInt(line);
}

sej mogoče sem tuki čist kiksnu... Kaj točno pa je tvoja variabla 'scan'? Ali so te številke ki si jih izluščil en sam niz ali jih imaš v kakšnem arrayju? Kaj ti vrača funkcija scan.next()?

Mogoče lahko poskusiš še trimat vsako številko preden jo parsaš.

Zgodovina sprememb…

  • spremenil: FlashM ()

Zlatan ::

imaš String, ki je "23 8 546 2 76 29" ??

če ja, bi jaz s StringTokenizer-jem niz razdelil na več kosov in vsak kos (oz. število) parsal.


Hmm... ja mislil sem, da je to String, ampak je to objekt tipa Scanner potem, ko izločimo vse "neštevilke".

Scanner ima tudi metodo nextInt().


Sedaj sem poskusil malo drugače:

 Scanner s = new Scanner(new BufferedReader(new FileReader(args[0])));
		 s.useDelimiter("\\(|\\)");
		 int vsota=0;

          while (s.hasNextInt()) {
        	  
              vsota=vsota+s.nextInt();
          }


Vglavnem, s Scannerjem preberem zadevo iz datoteke, znake, ki jih ne potrebujem, zamenjam s presledki in poskušam preostale številke seštet. Tole mi sicer sešteva, ampak le do tam, kjer sta prvič dva presledka. Ne gre mi v glavo, zakaj.:(

Zgodovina sprememb…

  • spremenil: Zlatan ()

FlashM ::

Če se ti nikjer ne pojavita več kot dva presledka, lahko dvojni presledek replace-aš z enojnim.

Ali v Javi obstaja TryParse funkcija ali pa IsNumeric?

BaRtMaN ::

A APIja pa nihče več ne gleda?

FlashM ::

Sicer nisem Java programer, sam sem včeri na hitro pogledu API za Scanner in če jst prav razumem, deluje tko da ti iz neke textovne datoteke vrača besedo za besedo. Ali se motim?

Če bi jst iz nekega tekstovnega fajla rabil dobit samo vse številke, bi to naredu tko, da bi bral datoteko vrstico po vrstico. Vsako prebrano vrstico bi besede splitnu v array. Za vsak element v arrayju bi testiral če je številka in jih potem sešteval skupaj.

Sicer pa je tole zlo odvisno od programerja kaj sploh želi s tem narest, tko da tkole na suho nekaj sklepat je itak brezveze... Mogoče obstaja še kakšna precej boljša pot...

Kar se pa tiče parsanja v JAVI, nisem nikjer zasledil, da bi imel funkcijo TryParse, kot jo ima C#. Zato bi to naredu tko, da bi parsal v Int in lovil NumberFormatException. Če je prišlo do exception-a, potem to ziher ni številka. Pa vsak string bi preden bi ga parsal v Int, bi še potrimal iz obeh strani.

Zgodovina sprememb…

  • spremenil: FlashM ()

fiction ::

s.useDelimiter("\\(|\\)");
Hm ok, da vidimo, ce prav razumem: to naj bi bil regexp \(|\) - se pravi delimitra sta znaka '(' ali ')'? Kaksna izgleda vhodna datoteka? Verjamem da bi nam le delcek te datoteke bolj pomagal kot vsi opisi.

Vglavnem, s Scannerjem preberem zadevo iz datoteke, znake, ki jih ne potrebujem, zamenjam s presledki
Zakaj karkoli menjas? Ce ze uporabis scanner bi lahko npr. samo rekel, da je delimiter vse kar ni stevka ala [^0-9].

Tole mi sicer sešteva, ampak le do tam, kjer sta prvič dva presledka.
Imam obcutek, da je fora v tem, da dobis "prazne tokene". Ce reces, da je presledek vmes, potem sta tole "a b" tokena a in b. Ampak "a  b" je pa dejansko a, prazno in b.

V primeru, da hoces "1 2bf3 4" obravnavati kot stevilke 1, 2, 3, 4, bi moral biti [^0-9]+ dober.

Ce hoces dobiti 1, 4 lahko vzames kot razmejitev whitespace (default), ampak potem gledas hasNext() in ce je hasNextInt() true integer vzames (nextInt()) in ga pristejes, ce ne pa tisto (next()) samo "pojes". Druga varianta je najbrz se taka, da uporabis "\\s+" (mnozico whitespacov) za delimiter in potem eksplictno pohandlas crap ala "2bf3" - npr. tako da to nekam zlogiras. V tem primeru namrec ne dobis praznih "zetonov".

Kar se pa tiče parsanja v JAVI, nisem nikjer zasledil, da bi imel funkcijo TryParse, kot jo ima C#.
Ja, to je res malo bedno, posebej zato ker je nacin, ki vkljucuje exception handling precej pocasnejsi. Ampak tukaj konkretno imas hasNextInt().

Pa vsak string bi preden bi ga parsal v Int, bi še potrimal iz obeh strani.
To je brezveze. Scanner, *Tokenizer, whatever je ravno zato, da se ti ni treba ukvarjati s parsanjem. Namesto, da beres znak po znak, beres enoto za enoto (karkoli ze pomeni pri tebi enota).


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[java] Osnovna vprašanja

Oddelek: Programiranje
372638 (1645) killa bee
»

Java Objekti

Oddelek: Programiranje
102265 (1959) Mavrik
»

Java - dva problema

Oddelek: Programiranje
141731 (1339) nightrage
»

[Java]Branje podatkov iz datoteke

Oddelek: Programiranje
342666 (1972) jeryslo
»

Java problem

Oddelek: Programiranje
51133 (989) YuLcE

Več podobnih tem