Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
01.01.2010 13:46:53
Java IO, Sisendi kontroll! |
|
|
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 |
|
 |
i8080
Kreisi kasutaja

liitunud: 15.03.2002
|
01.01.2010 14:33:13
|
|
|
if (muutuja instanceof Integer) ...
if (muutuja instanceof String) ...
|
|
Kommentaarid: 169 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
151 |
|
tagasi üles |
|
 |
Absona
Lõuapoolik

liitunud: 17.09.2008
|
|
Kommentaarid: 11 loe/lisa |
Kasutajad arvavad: |
   |
:: |
2 :: |
0 :: |
8 |
|
tagasi üles |
|
 |
hexmex
HV kasutaja
liitunud: 13.06.2006
|
01.01.2010 15:38:11
|
|
|
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 |
|
 |
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
01.01.2010 22:38:40
|
|
|
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 |
|
 |
i8080
Kreisi kasutaja

liitunud: 15.03.2002
|
|
Kommentaarid: 169 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
151 |
|
tagasi üles |
|
 |
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
02.01.2010 14:29:45
|
|
|
Ü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 |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
02.01.2010 15:52:38
|
|
|
-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 |
|
 |
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
02.01.2010 15:57:12
|
|
|
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 |
|
 |
guest1902
Kreisi kasutaja

liitunud: 05.11.2005
|
02.01.2010 16:01:51
|
|
|
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 |
|
 |
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
02.01.2010 16:04:26
|
|
|
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 |
|
 |
guest1902
Kreisi kasutaja

liitunud: 05.11.2005
|
02.01.2010 16:21:35
|
|
|
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 |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
02.01.2010 16:37:11
|
|
|
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 |
|
 |
-ordi-
HV vaatleja
liitunud: 03.06.2009
|
20.02.2010 18:26:48
|
|
|
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 |
|
 |
Bssldr
HV kasutaja
liitunud: 05.12.2009
|
15.03.2010 18:53:54
|
|
|
-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 |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
15.03.2010 19:29:25
|
|
|
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 |
|
 |
|