Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Java IO, Sisendi kontroll! märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
-ordi-
HV vaatleja

liitunud: 03.06.2009




sõnum 01.01.2010 13:46:53 Java IO, Sisendi kontroll! vasta tsitaadiga

Tere, kuidas saaks Javas sisendit kontrollida, kas tegemist on String tüüpi muutujaga või Integer tüüpi või hoopis midagi muud.


Probleem:

http://pastebin.com/m4154fa14
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
i8080
Kreisi kasutaja
i8080

liitunud: 15.03.2002



Autoriseeritud ID-kaardiga

sõnum 01.01.2010 14:33:13 vasta tsitaadiga

if (muutuja instanceof Integer) ...
if (muutuja instanceof String) ...
Kommentaarid: 169 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 151
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Absona
Lõuapoolik
Lõuapoolik

liitunud: 17.09.2008




sõnum 01.01.2010 15:20:29 vasta tsitaadiga

if (muutuja.gettype() == string) ...
if (muutuja.gettype() == integer) ...
jne..

kas javas objektist tüübi võtmine (typeof(mingiObjekt)) on olemas? Kui on, siis on mõistlikum seda kasutada.

_________________
Veebilehed, veebiprogrammeerimine, veebilahendused
Erinevad rakendused ja skriptid.
Kommentaarid: 11 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 8
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
hexmex
HV kasutaja

liitunud: 13.06.2006




sõnum 01.01.2010 15:38:11 vasta tsitaadiga

Absona kirjutas:
if (muutuja.gettype() == string) ...


Javas on kõik "stringid" String tüüpi objektid. String klassis ei ole sellist meetodit nagu gettype(). Samuti ei päri ta kuskilt sellist meetodit. Võimalus teada saada kas objekt (muutuja) on "string" on kasutades eelmainitud võtet if (muutuja instanceof String).

_________________
Olgem sõbralikud!
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
-ordi-
HV vaatleja

liitunud: 03.06.2009




sõnum 01.01.2010 22:38:40 vasta tsitaadiga

See if ( muutuja instanceof String ) täitsa toimib, tänud. Muidu missugust võtet oleks kõige mõttekam kasutada javas sisendi lugemiseks, võimalusi on päris palju.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
i8080
Kreisi kasutaja
i8080

liitunud: 15.03.2002



Autoriseeritud ID-kaardiga

sõnum 01.01.2010 22:51:39 vasta tsitaadiga

mingi TextIO meenub, oli päris asjalik sisendi lugemiseks

http://www.javacoffeebreak.com/books/extracts/javanotesv3/c2/s4.html
Kommentaarid: 169 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 151
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
-ordi-
HV vaatleja

liitunud: 03.06.2009




sõnum 02.01.2010 14:29:45 vasta tsitaadiga

Üks probleem on veel tegelikult.

Ma loen sisendi sisse.

BufferedReader sisend = new BufferedReader(new FileReader("fail.sis"));
String m = sisend.readLine();


Nüüd hetkel ma veel ei tea kas tegemist on int või String, hakkan kontrollima seda.


      if (muutuja instanceof String) {
          // Kui on nii, siis:
            int tulemus1 =  Konverdi1(m); // Ehk see meetod teisendab ainult String tüüpi muutujat, AA => 27
}
      else {
         // Nüüd on jama selles, et sisend on String ( 27)
        // Kuna tegemist on String tüüpi muutujaga ja mul oleks vaja see arv saada nüüd integeriks,
             int i = Integer.parseInt(m); // Muudame String tüüpi muutuja int tüübiks 
             int tulemus = Konverdi(i);
}


Aga millegipärast kui ma selle String tüüpi muutuja teisendan integeriks, siis väljastades seda annab ta mulle väga imeliku arvu, midagi 1300 -ga.
See töötab ainult siis, kui String ( number 27 näiteks on jutumärkides "27"), siis toimib kenasti see teisendus.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 02.01.2010 15:52:38 vasta tsitaadiga

-ordi- kirjutas:
Üks probleem on veel tegelikult.

Ma loen sisendi sisse.

BufferedReader sisend = new BufferedReader(new FileReader("fail.sis"));
String m = sisend.readLine();


Nüüd hetkel ma veel ei tea kas tegemist on int või String, hakkan kontrollima seda.


      if (muutuja instanceof String) {
          // Kui on nii, siis:
            int tulemus1 =  Konverdi1(m); // Ehk see meetod teisendab ainult String tüüpi muutujat, AA => 27
}
      else {
         // Nüüd on jama selles, et sisend on String ( 27)
        // Kuna tegemist on String tüüpi muutujaga ja mul oleks vaja see arv saada nüüd integeriks,
             int i = Integer.parseInt(m); // Muudame String tüüpi muutuja int tüübiks 
             int tulemus = Konverdi(i);
}


Aga millegipärast kui ma selle String tüüpi muutuja teisendan integeriks, siis väljastades seda annab ta mulle väga imeliku arvu, midagi 1300 -ga.
See töötab ainult siis, kui String ( number 27 näiteks on jutumärkides "27"), siis toimib kenasti see teisendus.

Kui sa failist Reader klassiga midagi loed, tuleb sealt igaljuhul String välja - seda esiteks. Teiseks, misasi on see muutuja, millega sa teostad kontrolli, kas tegemist on Stringiga? Seda mujal su koodis kuskil ei kajastu. Kolmandaks - kas see 1300 tuleb sul peale parseInt kasutamist või Konverdi meetodi kasutamist? Kui parseInt järel, siis järelikult ikkagi loetakse sul failist ka mingit jama sisse, sest Java standardklass üldjuhul toimib siiski korrektselt, kui Konverdi meetodi järel, siis oleks abi ka nende meetodite sisu nägemisest.

PS. Java naming convention ehk hea tava Javas asjade nimetamiseks ütleb, et meetodinimed algavad väiketähtedega ehk "konverdi", mitte "Konverdi"

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
-ordi-
HV vaatleja

liitunud: 03.06.2009




sõnum 02.01.2010 15:57:12 vasta tsitaadiga

Fukiku kirjutas:
-ordi- kirjutas:
Üks probleem on veel tegelikult.

Ma loen sisendi sisse.

BufferedReader sisend = new BufferedReader(new FileReader("fail.sis"));
String m = sisend.readLine();


Nüüd hetkel ma veel ei tea kas tegemist on int või String, hakkan kontrollima seda.


      if (muutuja instanceof String) {
          // Kui on nii, siis:
            int tulemus1 =  Konverdi1(m); // Ehk see meetod teisendab ainult String tüüpi muutujat, AA => 27
}
      else {
         // Nüüd on jama selles, et sisend on String ( 27)
        // Kuna tegemist on String tüüpi muutujaga ja mul oleks vaja see arv saada nüüd integeriks,
             int i = Integer.parseInt(m); // Muudame String tüüpi muutuja int tüübiks 
             int tulemus = Konverdi(i);
}


Aga millegipärast kui ma selle String tüüpi muutuja teisendan integeriks, siis väljastades seda annab ta mulle väga imeliku arvu, midagi 1300 -ga.
See töötab ainult siis, kui String ( number 27 näiteks on jutumärkides "27"), siis toimib kenasti see teisendus.

Kui sa failist Reader klassiga midagi loed, tuleb sealt igaljuhul String välja - seda esiteks. Teiseks, misasi on see muutuja, millega sa teostad kontrolli, kas tegemist on Stringiga? Seda mujal su koodis kuskil ei kajastu. Kolmandaks - kas see 1300 tuleb sul peale parseInt kasutamist või Konverdi meetodi kasutamist? Kui parseInt järel, siis järelikult ikkagi loetakse sul failist ka mingit jama sisse, sest Java standardklass üldjuhul toimib siiski korrektselt, kui Konverdi meetodi järel, siis oleks abi ka nende meetodite sisu nägemisest.

PS. Java naming convention ehk hea tava Javas asjade nimetamiseks ütleb, et meetodinimed algavad väiketähtedega ehk "konverdi", mitte "Konverdi"


Seda avastasin isegi et ta loeb seda igatpidi Stringiks. Vaata mu esimese postituse linki, seal on see kood siis.
See 1300 millegagi tuleb peale teisendamist, aga see on normaalne, sest põhimõtteliselt on mul vaja nii et kui on String siis üks meetod ja kui int, siis kasutab teist meetodit.


viimati muutis -ordi- 02.01.2010 16:03:11, muudetud 1 kord
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
guest1902
Kreisi kasutaja
guest1902

liitunud: 05.11.2005




sõnum 02.01.2010 16:01:51 vasta tsitaadiga

See instanceof on mingi kahtlane värk. Imo see tingimusdirektiiv (vms termin see ka pole) ei jõuagi sinna else-kohta, vaid käivitab selle esimese meetodi (Konverdi1(m)). Kui sa topiksid sinna meetodisse System.out.println(num); iga kord kui peaks num väärtus muutuma, näed ka, kust see 13.. tuleb.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
-ordi-
HV vaatleja

liitunud: 03.06.2009




sõnum 02.01.2010 16:04:26 vasta tsitaadiga

Nii ta on, else osasse see värk ei jõuagi, sest sisend on igatpidi String.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
guest1902
Kreisi kasutaja
guest1902

liitunud: 05.11.2005




sõnum 02.01.2010 16:21:35 vasta tsitaadiga

Aaga... Kuidas siis seda muutujakontrolli teha (ennast huvitaks ka)?
Ma teeks try-catch lausega...
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 02.01.2010 16:37:11 vasta tsitaadiga

Põhimõtteliselt, kui lugeda faili, siis fail on igal juhul tekst ja igasugused Reader klassid annavad alati Stringid lõpuks välja. Kui on soovi veenduda kas sisseloetud String on arv või mitte, siis mina näen kahte võimalust.

a) Üritada Stringi Integer.parseInt vms Stringist numbri tegemise meetodiga numbriks teha ning try-catch blokis NumberFormatException kinni püüda, mida nimetatud meetodid vastavalt dokumentatsioonile viskavad, kui sisend neile ei sobi. See ei ole samas elegantne, suured teoreetikud on minumeelest kunagi ka kirja pannud, et põhimõtteliselt Exceptionite kasutamine programmi juhtimiseks on halb praktika, samas ta töötab ja on lihtne.
b) Teiseks on elegantne võimalus. Kirjutada regulaaravaldis, millega tuvastada, kas sisend vastab meile soovitud numbri formaadile või mitte ning vastavalt sellele käituda. Viiteks siinkohal java.util.regex.Pattern klass.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
-ordi-
HV vaatleja

liitunud: 03.06.2009




sõnum 20.02.2010 18:26:48 vasta tsitaadiga

Kes vb kunagi sama probleemi otsa komistab:

public static boolean kasNumber(String str) {
      for (int i = 0; i < str.length(); i++) {
                if (!Character.isDigit(str.charAt(i)))
                                    return false;
      }
      return true;
}


Või:

public boolean isIntNumber(String num) {
      try{
      Integer.parseInt(num);
      } catch (NumberFormatException nfe) {
      return false;
      }
      return true;
      }
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
Bssldr
HV kasutaja

liitunud: 05.12.2009




sõnum 15.03.2010 18:53:54 vasta tsitaadiga

-ordi- kirjutas:
Kes vb kunagi sama probleemi otsa komistab:

public static boolean kasNumber(String str) {
      for (int i = 0; i < str.length(); i++) {
                if (!Character.isDigit(str.charAt(i)))
                                    return false;
      }
      return true;
}



Sellega on väike probleem. Kui sisend on näiteks "0193", siis ta loeb selle numbriks, kuid see pole seda.
Kommentaarid: 9 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 8
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 15.03.2010 19:29:25 vasta tsitaadiga

Bssldr kirjutas:
-ordi- kirjutas:
Kes vb kunagi sama probleemi otsa komistab:

public static boolean kasNumber(String str) {
      for (int i = 0; i < str.length(); i++) {
                if (!Character.isDigit(str.charAt(i)))
                                    return false;
      }
      return true;
}



Sellega on väike probleem. Kui sisend on näiteks "0193", siis ta loeb selle numbriks, kuid see pole seda.
Aga miks ei ole? Mingist Integer.parseInt() meetodist peaks selline sisend ludinal läbi minema küll ju.
_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Java IO, Sisendi kontroll!
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.