Hirdetés

Keresés

Új hozzászólás Aktív témák

  • nem tudjatok, hogy hogyan lehet lekerdezni a GCtol (akar a kodbol, akar runtime ,,kivulrol'') hogy melyik osztalynak hany peldanya letezik?
    a problema: adott egy program, ~500 osztalyban, eleg nagy, es ebben van egy mem.leak. ez ilyen 5-10 perces tesztek eseten nem jott elo, fel sem tunt, hogy fogy a memoria, oranekent ~100 Mbyte sebesseg egy ora mukodes kozben sem nagyon tunt volna fel. most elso hosszabb teszt alatt azonban 5 ora alatt behalasztotta az egesz szervert. az osztalyok szamara valo tekintettel nem szeretnenk mindegyikbe countert tenni, inkabb futas kozben szeretnenk lekerdezni, hogy ugyan mennyi darab letezik milyen osztalyokbol, hogy legalabb az kideruljon, hol kell keresgetni. valami otlet?

    [Szerkesztve]

    Futtasd valami profilerrel, ami tud mem allokációkat naplózni, pl. JProfiler. Abból elég jól ki fog derülni, miből van több mint kéne... Remélhetőleg a referenciákat felesleges módon megtartókat is végig tudod követni vele. Ez így már sokkal többet tud mint hogy mennyi objektum van. :)

    [Szerkesztve]

  • Hi!

    Megvan a hiba, hiányzott a validate().

    Ha van valami konkrét GridBages kódod, ami nem úgy megy ahogy gondoltad, copyzd ide a constrainteket tartalmazó részeket:
    (constraint írás; container.add(...); constraint írás; ..add(...); stb)
    és akkor tudunk segíteni.

  • Hi!

    És ha valami direkt Visual IDE-t használnék? Pl. JBuilder 9?

    Hát, egészségedre, én valahogy irtózom a JBuilder-től (*Builder-től)... Inkább legyél türelemmel és tanuld meg mélyebben. Látom legalább hagyott nyomot benned az Szglab4. :)

  • Hi!

    Eclipse-et használok, de nem tudom, melyik plugin kell hozzá. Ebben tudnál segíteni?

    Visual Editor: Bővebben: link
    Amúgy kézzel sem nagy cucc, ha kitapasztalod kicsit hogy mit tud. Gyakorlatilag komponensenként max 2-3 sorban beállíthatod a paramétereket, ennyi szokott lenni.

    [Szerkesztve]

  • eheh hat ez sztem nem tul optimalis megoldas ;)
    ime az en otletem:
    olvasod az egyik filet, es pakolod bele az elemeket gondolkodas nelkul 1 hashtable-be.
    aztan amikor vegeztel elkezded olvasni a masik filet, es minden szora rakeresel a hashtable-ben, ha megtalalod akkor kiirod kimenetre, (es ha csak egyszer kell kiirni akkor torlod a hashtable-bol, ha tobbszor is lehet akkor ez a zarojel targytalan) es olvasol tovabb :)
    ez kb 6 sor amit en most felvazoltam, es szerintem gyorsabb is, es kevesebb memo kell hozza, mint a ket vektoros megoldashoz :P

    szerk: hashtable helyett valamilyen set-szeru dologba megjobb volna, foleg ha hash-alapu, de nem tudom van-e ilyen adatszerkerkezet alapbol az APIban

    [Szerkesztve]

    Gondoltam a HashSet-re, de elvetettem, mert az kezdőknek esetleg kevésbé érthető hogy mért jó az. :)
    Amire gondoltál az a HashSet, ilyen van, rendben. Elvileg a beillesztés/keresés O(1) idejű benne, de pl. telítettség függvénye a konstans szorzó és alapvetően elég nehéz megjósolni. Összességében tehát O(n+m) lépés lenne a HashSetes módszer. A rendezéses módszer garantált O(nlogn)+O(mlogm), meg még min(n,m) lépés.
    Attól függ hogy átlagban, vagy legrosszabb esetben hogyan kell teljesítenie az algoritmusnak. :)

  • ha nem nagy kérés légyszíves!
    minden tipp érdekel!

    Ezzel a két fileban előforduló közös szavak problémájára javasolnék egy normális (értsd hatékony :) ) algoritmust:

    1. mindkét listát beolvasva pl. lexikografikusan rendezed őket egy-egy vektorba, legyenek ezek: v1, v2
    2. k=0, j=0
    3. do
    4. ha v1[k]<v2[j] akkor k++
    5. egyébként ha v1[k]>v2[j] akkor j++
    6. egyébként nyilvánvalóan v1[k]==v2[j] teljesül tehát találtunk egy közös elemet; k++, j++
    7. while k<v1.length && j<v2.length

    Az egyező elemeket a 6-os lépésben el lehet tenni egy másik vektorba.

    [Szerkesztve]

  • még mindig avval a problémával szarakszom hogy nem tudom ugy megcsinálni hogy ha egy képre kattintok akkor bezárja azonnal a lapot, rákérdezés és semittevés nélkül!!!!


    Plíz

    Lap, kép, micsoda?
    Ha ez valami html+javascript, akkor javaslom a javascriptes topicot, mert ennek a java-hoz semmi köze.

    mod: ha arra gondolsz, hogy egy browser-ablakot bezárni, akkor a válaszom az hogy nem teheted meg. Ugyanis ehhez a javascriptnek direkt nincs joga. Nem javascriptből nyitott ablakot egyáltalán nem zárhat be, javascripteset esetleg rákérdezéssel.

    [Szerkesztve]

  • Tomcat 5.5, ahogy már mondtam és végigzúztam egy keresést a gépen, nem volt ilyen jar. Számomra is érthetetlen. Az SDK meg a már szintén fent említett J2EE SDK 1.4.10 (2005Q1). Ezek vannak fent. Eclipset meg felteszem valószínűleg, csak mostanában nem foglalkoztam java-val. Egyébként a 3.x-es Tomcatban benne van az a jar, onnét bányásztam ki...

    De akkor mindjárt lezúzom és visszarakom az egészet, megnézzük, hátha telepítésnél a ''next next next finish'' közben elnéztem valamit ;)

    Az ok hogy a Java SDK megvan, én a Tomcat SDK-ra gondoltam. Feltételezvén hogy esetleg van egy verzió mindenféle fejlesztői kiegészítők nélkül, meg van az SDK-s verzió. Elképzelhető, hogy tényleg az installban kell bepipálni valamit.

  • ''Egészen biztos vagy benne hogy van a servlet-api.jar-ban javax/servlet könyvár, ugye?''

    Nos, nem :) A servlet.jar kell nekem, csak az nincs a gépemen. Most így hirtelen rántottam le netről, azzal fordítva úgy tűnik megoldódik, csakhát ez kicsit nem elegáns megoldás...

    Én is Eclipseztem, mindaddig, amíg olyan sorokat alá nem huzogatott nekem meg szopatott, hogy nem hajlandó lefordítani, amit parancssorból simán fordítottam. És ezzel hosszú órákat szúrtam el, mire rájöttem, nem bennem van a hiba. NetBeans-szel meg az a bajom, hogy lassú. De igazad van, jó lenne egy IDE. Lehet felteszem a legújabb Eclipse-t, hátha javítottak rajta.



    Akkor mit töltöttél le, amit apache tomcat néven terjesztettek, és nem volt benne ez a jar? Biztos hogy a megfelelő SDK-t, blabla?

    Nem tudom milyen Eclipse-et használtál, én kb 2 éve használom _nagyon_ sokat (2.1-től), és soha nem volt olyan amit egy editorablak-bezár-újranyit művelet nem oldott volna meg. Legrosszabb esetben egy clean project. Ne csináld már :)

  • classpath-ból kiszedtem most a könyvtárat.

    A hibaüzenet egész pontosan a következő:

    ElsoServletem.java:2: package javax.servlet does not exist
    import javax.servlet.*;
    ^

    utána meg az ebből következő hibaüzenetek.

    javac -classpath ''d:\Program files\Apache Software Foundation\Tomcat 5.5\common\servlet-api.jar'' ElsoServletem.java

    és így sem szereti...

    [Szerkesztve]

    Egészen biztos vagy benne hogy van a servlet-api.jar-ban javax/servlet könyvár, ugye? Meg hogy pontos az elérési út? Javaslom, hogy inkább mindenhova használj slasht backslash helyett, windóz alatt is. Ha ezek megvannak, akkor érdekes...
    Amúgy a mérhetetlen produktivitás növekedés elősegítése érdekében javaslom, hogy használj egy jó IDE-t, és ne parancssorból szerencsétlenkedj. Én az Eclipse IDE-t használom mindenre. Ismerd meg azonnal, ha eddig nem tetted. :)

    [Szerkesztve]

  • Valószínű, az lesz amit írtál, gondolom a doksi egy régebbi Tomcathez szól, amiben még úgy volt.

    Nos beletettem a CLASSPATH-ba ezeket:

    d:\Program files\Apache Software Foundation\Tomcat 5.5\common\;d:\Program files\Apache Software Foundation\Tomcat 5.5\common\servlet-api.jar;d:\Program files\Apache Software Foundation\Tomcat 5.5\common\jsp-api.jar

    egyenlőre még nem nagyon érzi át a javac, hogy én szeretnék servletet fordítani. Kell még valamit csinálni ezzel?

    Jegyezd meg melyik osztállyal van baja a fordításnál, és azt keresd meg a jarokban.

    A classpath-ban amúgy 2 féle bejegyzés lehetséges:
    - ha könyvtárat adsz meg, akkor az azon belüli összes .class filet figyelembe veszi, rekurzívan, de a jarokat nem!
    - jart is megadhatsz, de egyszerre csak egyet.

    Tehát az általad megadott ''d:\Program files\Apache Software Foundation\Tomcat 5.5\common\'' nem jó, ha az ottani jar fileokat akartad includeolni. Egyenként fel kell sorolni őket...

    Kivétel, ha az egyik jar-ban van olyan manifest.mf, amelyben leírja milyen jarokra van szüksége. Amennyiben azok az ahhoz a könyvtárhoz relatívan megadott elérési úton megvannak, akkor azok a jarok automatikusan includeolódnak, nem kell külön CP-ben megadni. Ez persze rekurzívan működik.

    [Szerkesztve]

  • Multkor talaltam egy ilyen kerdest:

    Melyik kodreszlet fut le hamarabb?


    float x=(float)1e8;
    while(x>0) x--;



    vagy


    double x=1e8;
    while(x>0) x--;



    Elsöre talan meglepö a megoldas, de vegulis logikus :)

    Elég rossz kérdés... :)
    Mit jelent itt az, hogy ''hamarabb''? Ha utasításciklusokban mérjük, akkor attól függ milyen gépen fut, ha meg időben mérjük, akkor még az ütemezés is számít.

    Válasz: ki tudja. Ja, azt esetleg ki lehetne számítani, hogy adott kezdőfeltételek mellett mennyi valószínűséggel fut le egyik hamarabb mint a másik :)

    Amúgy olyasmire akar kilyukadni, hogy a float és double kivonás között milyen különbség van? Reflexből mondhatnám, hogy a virtuális gép utasítások szintjén a floatos gyorsabb, mert csak 32 bit, kevesebb művelet. Aztán lehet persze, hogy a mai FPU-k ugyanannyi idő alatt végeznek egy float és egy double kivonással.

    mod: áá rájöttem hogy mi akar ez lenni: a floatos végtelen ciklus, a double-os nem, ugye? :)

    [Szerkesztve]

  • Egy utolsó kérdés aztán hanyagolom a témát. Mi az a TC?
    Biztos nem Total Commander.

    De, Total Commander :D
    Most már meg is nézem amire gondoltam... ja igen, kijelölsz egy jar filet, aztán Files/Associate menüpont. Ott mindent megadhatsz.

  • Ez tök jó ötlet.

    Csak még egy kérdés:
    Ugye van olyan, hogy minden kiterjesztéshez lehet társítani egy progit ami megpróbálja megnyitni. jar-hoz megadtam a java.exe-t. De, hogy tudom azt megcsinálni, hogy a -jar kapcsolóval hívja meg?

    Ugyanott megadhatod... ha win-ről beszélünk, akkor TC alatt talán van egy ilyen dialog. Amúgy nem tudom, de reg hackeléssel megtehető.

  • kösz!

    hogy miért kell egy fájl?
    hát nem úgy egyszerű futtati egy programocskát?
    1 db. exe és ennyi, nincs installshield stb, klatty oszt fut.

    ezért vagyok ellene a javának, amúgy - suliban ezt erőltetik, elhiszem hogy ez a divat, stb. de talán nem ezzel kéne kezdeni

    UI: nem tudom mennyi a jre ''lecsontozva'', de most képzeld el, hogy egy egysoros java progiért becsomagolom a fél vinyómat! ;]
    jó, persze lehet mondani, a java nem erre való

    [Szerkesztve]

    A Java nem erre való. :D
    Manapság már illik adni kicsit a modularitásra. Értsd, nem teszünk bele mindent egy exe-be statikusan, hanem közös dll-ek, stb.
    Ez a ''mindent egybe'' szoftvertervezési módszer... öö... elavult, és a Java meg ilyenek nem ''divat'' kérdése, hanem komoly mérnöki munka és tapasztalat eredménye.

    Persze egy beágyazott rendszerbe (autó, hifi, tv) nyilván nem való ez a dolog (még!). :)

    A jre-nek meg van installerje, azt telepíti külön, és örül magának, mert soha többet nem kell megtennie. A saját progidhoz is csinálsz installert, ha már átlagusernek írod, és azzal sem lesz gond.

    [Szerkesztve]

  • na most légy szíves írd le egy kezdőnek, hogy is csináljak konkrétan futtatható állományt.
    a legegyszerűbb eset: kiír egy sort a konzolra, és kész

    na most ezt elküldöm valakinek, sima felhasználó, a gépén nincs semmi java, stb. annyit ért hozzá, hogy dupla klikkre indulnak a progik.

    tudsz segíteni?
    köszi!

    UI: ja és lehetőleg 1 fájl legyen - és bekavar-e ha az illető gépén pl. winrar sincs a tömörített állományok kezelésére, vagy ez a jar nem az a jar?


    [Szerkesztve]

    Úgy hogy nincs a gépén Java runtime, nem fog futni Java progi...

    1) le kell töltenie (vagy mellékeled) a legfrissebb jre-t.
    2) a programodat tetszőleges számú jar fileban beinstallálod egy könyvtárba
    3) a link amire duplaklikkel behívja a fent említett parancsot, amivel a progi elindul.

    Mért legyen lehetőleg 1 file, nem értem... semmi értelme.
    Semmi egyéb program nem kell Java runtimeon kívül, a .jar fileok igaz hogy .zip-ek, de a jre természetesen tudja kezelni magától, semmivel nem kell foglalkozni.

    Persze ha már van java-s progija az illetőnek, akkor az egyes pontot nem kell elvégezni.

  • JBuilder X Foundationt használok. Ingyenesen letölthető és tanulási célokra használható.
    Van is ilyen menüpont, hogy ''Native Executable Builder'' de nem aktív.
    Nekem nem is natív fordító kéne, hanem az, hogy lehessen dupla klikkel indítani mint egy normál alkalmazást. Jar-ba sikerült már összeraknom, így legalább nincs húsz osztály, de még mindig csak parancssorból tudom indítani.

    create ''app.bat'', beleír:
    java(w) -jar jarfile
    kész :)
    vagy tetszőleges más módon.

  • Tsokolom!

    Belekukkantottam a temaba, de nem leltem semmit ami a problemamra megoldas lenne:
    Nem is problema, inkabb kerdes. Kellene nekem valami okos XML parser, de nem nagyon talaltam olyan leirast, ami kiterne arra, hogy a parser felolvassa az egesz cuccot a memoriaba, vagy pedig streamkent viselkedik. Streames cucc kellene, mert elkepzelheto pl. hogy egy nagyobb video vagy hasonlo binaris adatkupac utazik az xml fileban, es nem lenne igazan hasznos ha felolvasna az egeszet.... ha mar van ilyen akkor a fenenek van kedve megirni :)

    [Szerkesztve]

    Van egy olyan lib, hogy JDOM. Ez jó. Eddig mindig a SAXBuilder-t használtam, az végigparszolja a memóriában és fát épít belőle, azt mondod hogy ez nem túl jó.
    Ezen kívül van a SAXParser, ami nem olvassa fel, hanem egy összetett listener rendszeren keresztül küldözgeti neked az elemeket, így streammel is elboldogul talán.
    Videót XML-ben? Állat :D
    Nem lenne értelmesebb egy saját protokoll, ami csomagokra bontja a nagy bináris adatfolyamot, és közötte lehet olyan csomag, hogy ''metaadat'', ami egy xml dokumentum lenne?
    A SAXParser természetesen legalább egy elemet mindig teljesen felolvas, sőt nyilván az aktuális elem összes parentjét is meg kell tartania. Így ne gondolj olyanra, hogy 100 megás text adat. Ráadásnak XML-ben binárisat nem tudsz normálisan átvinni, legegyszerűbb a Base64 encode, ami még a méretet is növeli, igaz tömörítéssel részben visszahozhatod azt.
    Gondold meg, na.

  • Ez szopó!
    Amugy nem vagyok programozó. De gondolom az a a=....sok szám ami gáz
    azt nem tudom észre vetted -e hogy ha kijelölöd és huzod az egeret balra akkor még folytatódik a sor.
    Hátha az segít
    Amugy meg vminek lennie kell , mert a progi meg müxik

    Nem, a hosszú sorok Java-ban is szintaktikailag helyesek. Ami nincs: goto, illetve azok a hosszú nevű azonosítók.
    Szumma: ez nem java, csak valami zombi/mutáns. :)

    mod: ilyen formában ez egy programrészlet, azok a hosszú azonosítók lehetnek korábban deklarált változók, stb. Mondjuk érdekes az a return ott a közepén. Goto tényleg nincs.

    [Szerkesztve]

  • Melyik topicba kéne felraknom ahol értenek hozzá? :R

    Ez gáz, ugyanis nemhogy nem tudok a PH!-n javasolni topicot ennek, hanem az egész rohadt nagy neten nem láttam még soha ilyet, és néhány kulcsszóra google-özve sem találtam semmit, úgyhogy... no comment, sok sikert, engem is érdekel ha jutottál valamire. :D
    Ez így nem Java, annyi biztos. Van köze hozzá a szintaxisnak, de abszolút nem ugyanaz.

  • Ezt aprogramrészletet vki elmagyarázná nekem:


    _L2:
    e = ''\346\376\021\021\346\377\021\021\346\375\021\021\354\000\366\375\000\376\340\001\340]\\\021\360\301\\!\000\034\334O\231Nf\362\017\000\000\022(\321=\365(\345F\361\314\230=\032\340\f\340\002\230\034f\361\377\360F\361\346\360=\r\250\034F\361\252\n=\t(\302\346\361\372\000\270\034\b\302\346\361\000\371\270\034x!F\374\376?=\352\334O\271N\374\000\333\0''.getBytes();
    d = ''\346\376\021\021\346\377\021\021\346\374\021\021\346\000\021\021\346\367\021\021\276\210\346\372\252\n\346\373U\005\346\362U\252\347\367\240\000\334O\230\036\273\004(r=\373\267H\267\267\271Z\271K\271z\270\034\250L@A=\375\b\302\313\0''.getBytes();
    return;
    a_javax_microedition_midlet_MIDlet_static_fld = arg0;
    arg1;
    a_javax_microedition_lcdui_y_fld;
    b = ''\276\210\346\372\252\n\346\373U\005\346\362U\252\347\367\240\000\346\000\003\002\346\374\000>\346\376f9\340?\346\3670\000\334O\230\036\273\025(q=\373\346\000\000\002\346\374`\001\340\001\273\r\346\361\r8\273\n\346\374\324\001\346\361\372\200\273\005\346\361\000\376\273\002\267H\267\267\271Z\271K\271z\270\034\250L@A=\375\b\302\313\000\327P\003\000\362\376$:\362\377&:F\376nu=\037F\377tz=\034\346\000\000\000\346\b\000\374\314\000\314\000\346X\006\000\273\027\302\364\262\376\346\360\000\372\000@\273\021\244\000\262\376\b\001@\004=\372\273\013\346X\245\000~\266\232\266\376p\372\000\000\372f\374\377?\372\200d\001\232\267\376p~\267\313\0''.getBytes();
    c = ''\346\376\021\021\346\377\021\021\346\374\021\021\346\375\021\021\346\362\021\021\334M\231,\334O\271.\b\341(!=\371\333\0''.getBytes();
    if(true) goto _L2; else goto _L1



    :R

    Öööö... tudod, ez egy Java topic. :)
    Elárulod, hogy ezt honnan szedted?

  • na közben összejött...

    Megkérdezhetem, hogyan? Gondolom rájöttél hol hibás a gondolat.
    Másrészt viszont ilyen kulcsra való keresést (itt egy String a kulcs) ne Vector-ban, hanem HashMap/HashSet-tel vagy TreeMap/TreeSet-tel csinálj, mert a vector nem erre való. Ugye Vector esetén O(n) az elérési idő, Hash*-nél átlagosan O(1), Tree*-nél garantált O(log n).

  • randommal kapcsolatban:

    néhány java óra után, no meg egy kis tanulást követően látom micsoda sületlenségeket hordtam össze! ;] :DD

    Heh... régen volt az már, semmi gond! :D

  • köszönöm a kielégítő választ :)
    Kérdezhetnék még egy konkrétat is? :U


    1.
    Mi a hiba az alábbi forráskódban?
    public class Application {
    class Vector { double m_x, m_y; Vector(double x, double y) { m_x = x; m_y = y; } }
    public static void main (String[] args) { Vector v = new Vector(0.0, 0.0); }
    }

    Fordítóval kipróbáltam, hogy az a hiba, hogy a class Vector elé kell a static szó.
    De miért? nem igazán értem. :(


    2.
    Mi a hiba az alábbi forráskódban?
    class A { int a;
    static class B {
    B(int aa) { a = aa; }
    }
    }

    Itt pedig az a hiba, hogy nem kell a static a class B elé. De ennek sem igazán értem a miértjét...
    Hálás lennék, ha elmagyaráznád!
    Előre is köszi :)

    Nyugodtan :D
    Bár úgy látom, hogy a kérdéseidre kifejtettem már a választ, csak nem pont ezekkel a példákkal... na lássuk:

    1. A hiba valóban az, hogy oda kell a static, ugyanis (ahogy már leírtam): tetszőleges osztályban definiált static függvény osztálypéldány nélkül hívható. Ez azt jelenti, hogy nem tud hozzáférni (nem ''látható'' a függvény törzséből) semmilyen nem-static osztályváltozó. A nem-static belső osztályokra ez a szabály azért vonatkozik (tehát nem tud létrehozni olyan belső osztály típusú objektumot), mert a nem-static belső osztályok példányainak alapból rendelkezniük kell referenciával a külső osztályuk (amiben definiáltad a belső osztályt) egy példányára. Méghozzá pontosan arra, amely teremtette őket.
    A belső osztály példány referenciája a külsőre úgy néz ki, hogy A.this (ha A a külső osztály neve). Remélem összeállt...

    2. két lehetőség: nem kell static a B osztály elé, vagy éppen static kell az int a elé.
    A szabály ugyanaz, mint az előbb: mivel a belső osztály statikus, nem kötődik külső oszályhoz, így a belső példány nem is rendelkezik információval (referenciával) az ő bennfoglaló objektumáról, ami ha a staticot eltöröljük, az A osztály egy példánya lenne.
    Így a
    a = aa;
    sorban nem tud hozzáférni az 'a' változóhoz, ugyanis a szimbólumtáblázat látható részében (hogymondják szépen magyarul azt, hogy scope? :) ) nincs ilyen változó!

    Ugye amikor azt írod hogy 'a', ebben az esetben prioritási sorrendben így tud feloldódni a jelentése:

    1) lokális blokkban ({ } közötti utasítások) lévő változók
    2) szülő blokkban lévők
    3) rekurzívan a függvény fejlécig, itt a fgv paraméterek jönnek be
    4) osztályváltozók (ez az ami ilyen bonyi szabályokkal írható le, ahogy eddig tettem)

    Az utóbbinál az 'a' szimbólum ekvivalens a 'this.a'-val, amennyiben a belső rendelkezik nem-static 'a' nevű változóval; továbbá ekvivalens 'Belsoosztaly.a'-val, ha rendelkezik static 'a' nevű változóval.

    Van egy ''5.'' szint, amennyiben egy belső osztályban használt változóról van szó. Ilyenkor az 1-es ponttól oldjuk fel ismét rekurzívan attól a helytől kezdve, ahol az osztályt definiáltad... így lesz az 'a'-ból 'Kulsoosztaly.this.a', ha a belső osztály nem static és a a Kulsoosztaly rendelkezik nem static 'a' változóval, a static szintaxis meg egyenlő a fentivel, tehát a 'Kulsoosztaly.a' static(!) változó mindenhonnan hozzáférhető, akár static, akár nem a belső osztály.

    Hmmm... remélem érthető :U

    [Szerkesztve]

  • Ez egy picit összetett dolog, biztosan ki is fogok felejteni valamit.
    Használat módjai:

    - static osztály változók: nem keletkeznek objektumonként, hanem az osztály összes példánya közösen használja a változót
    pl.
    class A { static int count; A() {count++;} }
    esetén minden egyes konstruktorhívásnál inkrementálódik a count.

    - static tagfüggvények: az előbbihez kapcsolódik, ugyanis ilyen függvényhez nem tartozik objektum. Ezt úgy értem, hogy a class A { static void fgv() {} } oszály fgv függvénye így hívható: A.fgv(); Természetesen ennél fogva nincs az fgv-ben definiálva ''this'' változó és ezért nem-static osztály változók/függvények sem használhatók, viszont static-kel jelöltek igen. (Persze ha átadsz paraméterben bármilyen objektumot, azzal azt csinálsz amit akarsz.)

    - static belső osztályok: olyan osztályon belül definiált osztályok, melyek nem kapcsolódnak a külső osztályhoz példányszinten. Huh, ez bonyi :)
    Na szóval:
    class A { static int count; int local; static class B { }}
    ilyenkor az A.B osztály példányosítható A-n kívülről. Egyébként nem! Továbbá az A.B osztály nem fér hozzá az A.local változóhoz, de az A.counthoz igen.

    Ööö van még valami?! :)

    [Szerkesztve]

    Kiegészíteném a nem-static belső class-ról mondottakat azzal, hogy példányosíthatóak kívülről, amennyiben a new operátor egy kevéssé szokásos szintaxisát használjuk.
    pl. legyen:


    class A {
    int a;

    class B {
    void ezmuxik() {
    // itt hivatkozunk a kulso osztalyra! Ehelyett irhatunk a++;-t, ha az egyertelmu.
    A.this.a++;
    }
    }
    }

    Van egy másik osztály, mely ezt csinálja:

    class C {
    void f() {
    // hibas! ''no enclosing instance of A''
    new A.B();
    // gyartunk egy A-t
    A a_peldany=new A();
    // explicit megadhato az enclosing instance!
    A.B ab_peldany=a_peldany.new B();
    }
    }


    Na kezd teljes lenni a dolog. Remélem érthető.
  • Sziasztok!
    A ''static'' kulcsszóról mit tudtok?
    Mikor kell, mikor használjuk, stb...?

    Tehát pl
    - static class Name

    Előre is köszi az infókat!

    Ez egy picit összetett dolog, biztosan ki is fogok felejteni valamit.
    Használat módjai:

    - static osztály változók: nem keletkeznek objektumonként, hanem az osztály összes példánya közösen használja a változót
    pl.
    class A { static int count; A() {count++;} }
    esetén minden egyes konstruktorhívásnál inkrementálódik a count.

    - static tagfüggvények: az előbbihez kapcsolódik, ugyanis ilyen függvényhez nem tartozik objektum. Ezt úgy értem, hogy a class A { static void fgv() {} } oszály fgv függvénye így hívható: A.fgv(); Természetesen ennél fogva nincs az fgv-ben definiálva ''this'' változó és ezért nem-static osztály változók/függvények sem használhatók, viszont static-kel jelöltek igen. (Persze ha átadsz paraméterben bármilyen objektumot, azzal azt csinálsz amit akarsz.)

    - static belső osztályok: olyan osztályon belül definiált osztályok, melyek nem kapcsolódnak a külső osztályhoz példányszinten. Huh, ez bonyi :)
    Na szóval:
    class A { static int count; int local; static class B { }}
    ilyenkor az A.B osztály példányosítható A-n kívülről. Egyébként nem! Továbbá az A.B osztály nem fér hozzá az A.local változóhoz, de az A.counthoz igen.

    Ööö van még valami?! :)

    [Szerkesztve]

  • Hi!

    Azt hittem, hogy így gondoltad a PrintStream konstruktorát, hogy egy OutputStream-et fogad paraméterként. Ezért ezt írtam:
    OutputStream out=new OutputStream();
    PrintStream printer=new PrintStream(out,false,''852'');

    És utána ezt akartam csinálni: printer.print(''aéáéáő'');

    Ezek szerint nem így kellett volna. :)

    Korrekt, csak az a kérdésem hogy az out az szerinted minek a kimenete lenne? :) Az így lóg magában és megy a szöveg az éterbe, mi? :)
    Gondoltam vágod, hogy a wrappelendő objektum a System.out vagy System.err, vagy bármilyen létező OutputStream.

  • Hi!

    Köszi az építő jellegű hozzászólást, de valahogy a Java nem szereti ezt az OutputStream jellegű dolgot, azt írja rá, hogy nem tudja inicializálni, mert nem egy konkrét osztály. Megnéztem, a kontruktora paraméter nélüli, elvileg semmi akadály nincs, hogy létrehozza, de nem tudja mégsem.

    Ezek szerint nem értetted amire gondolok. Természetesen nem egy OutputStream-et kell létrehoznod, hanem a PrintStreamet!
    new PrintStream(System.out, false, ''852'');
    Én csak a PrintStream konstruktor paraméterezését vágtam be ide...

    mod: megnéztem, az OutputStream osztály absztrakt (és mért ne lenne az, nincs hozzárendelve semmiféle ''kimeneti eszköz'', így natúr), így természetes hogy nem lehet konstruálni. Pontosan mit akartál csinálni?

    [Szerkesztve]

  • Hi!

    Tudtok nekem segíteni? Konzolos Java alkalmazást írunk, de van egy aprócska gond. Az ékezetes betűk helyett mindenféle absztrakt jeleket ír ki a DOS ablakban. Tudja valaki, hogy hogyan lehet módosítani a használt betűkészletet? Sürgős lenne. Köszi!

    Jah, elcseszett windózos konzol. A System.out-ot (vagy .err-t) wrappeld egy ilyenbe:
    PrintStream(OutputStream out, boolean autoFlush, String encoding)
    ahol az encoding legyen ''852'' asszem.
    Illetve válogathatsz innen: Bővebben: link :)

  • Épp megjöttem egy kis alkoholizálással egybekötött koncertről, épp ideje belenézni a Java topicba :D
    Erre tényleg. Meg is nézem.

    Megjegyzéseim:

    mod: amikor elkezdődik a dőlt szöveg, ott volt egy [ i ]. Lesz több is, de semmi kedvem kijavítani mindenhol :)

    - a Kartya.PIN-t inicializáld a véletlen számmal.

    - a Penzintezet.befizet(int osszeg, Szamla szamla) metódusban a szamla.egyenleg+=osszeg; ronda. Elvileg eléred, ha nem private, de akkor is szebb egy szamla.addEgyenleg(osszeg);. Későbbi hülyeségektől menthet meg.

    - itt hasonlóan:
    public int kivesz(int osszeg, Szamla szamla) {
    int kivet;
    if (szamla.egyenleg<osszeg) {
    kivet=szamla.egyenleg;
    szamla.egyenleg=0;
    return kivet;
    }
    szamla.egyenleg-=kivet;
    return kivet;
    }
    (ez kicsit rövidebben is írható, de ez most mind1)

    - Itt kezdődnek a problémáid (NullPointerException démon képében):
    public void befizet(int osszeg, int szamlaID, String nev) {
    for (int i=0; i<=MAX_UGYFEL_SZAM; i++) {
    // oops, mért MAX_UGYFEL_SZAM-ig? a tömb tele lehet null-okkal. ráadásul túlindexeled a tömböt eggyel!
    if (szamlak.getSzamlaID()==szamlaID) {
    if (szamlak
    .getTulajdonos()==nev) {
    szamla.egyenleg+=osszeg;
    }
    }
    }
    }
    helyesen:
    public void befizet(int osszeg, int szamlaID, String nev) {
    for (int i=0; i<ugyfelekSzama; i++) {
    // ugyfelekSzama használandó, ha már van, és tudod hogy addig nem null a tömb.
    // esetlegesen egy if (szamlak
    !=null) is betehető ide, ha össze-vissza lennének, ami nem igaz.
    if (szamlak.getSzamlaID()==szamlaID) {
    // használhatnál && operátort, nem muszáj külön ifeket.
    if (szamlak
    .getTulajdonos()==nev) {
    // itt sejted mit kommentálnék ismét :)
    szamla.egyenleg+=osszeg;
    }
    }
    }
    }
    a kivesz(...) metódusra hasonlóan.

    - a szamlaletrehoz(...)-ban ugye illene egy allokáció, vagy kapsz egy gigantikus NullPointerExceptiont a fejedbe, mint véres fejdísz. :)
    így: new Szamla(...), aztán azon operálva, majd beletéve a tömbbe. Megint, nem írunk át más osztálybeli adattagokat, ha aranyosak vagyunk.

    - Takarekpenztar.szamlaletrehoz(...): felüldefiniálást nem úgy kell feltétlenül érteni, hogy copy-paste-1-sor-módosít. :) Meg lehet hívni a felüldefiniált metódust.
    pl: {
    if (egyenleg==0) return null;
    return super.szamlaletrehoz(egyenleg, nev);
    }
    Amúgy ez a struktúra amit a feladatban kijelölnek, kicsit rossz lenne komoly alkalmazásnál, dehát csak egy feladat.

    - public Terminal(String bank) {
    // NullPointerException: bankmezo==null
    bankmezo.terminalokSzama++;
    // intezetNeve: undefined symbol
    intezetNeve=bank;
    }

    - Terminal.kivesz hiány :)

    Ja, ha jól értem itt befejezted. További sok sikert!
    Annyival kommentálnám még az egészet, hogy egy valós alkalmazásban megfelelő adatstruktúrákat alkalmaznék (ami itt ellentmond a feladattal, mert tömböket kell használni), ami nem lineáris keresést tud (Hash, Tree). Tudom, tudom, ez a feladat, bocs hogy beszólok.

    [Szerkesztve]

  • Köszi a segítséget. Egy-két dolog világosabban áll előttem, de sokszor olyan, mintha sötétben tapogatóznék :) (nem, most nem vagyok részeg :D)
    Félig-meddig megcsináltam a gyakorló feladataimat. Ha szépen megkérlek, és ha időd engedi, megnéznéd, hogy miket rontottam el? Fordítani nem is próbáltam, mert még kész sincs, szintaktikai hiba nem érdekel, hanem ''csak'' az elvi hibák.

    Itt vannak az általam írt forráskódok: Bővebben: link
    És itt maga a feladat: Bővebben: link
    Nem azt kérem, hogy old meg helyettem, mert ezek csak a ZH-ra való gyakorlás miatt kerültek kiadásra, semmi pontot, jegyet nem kapok értük. Még mielőtt felháborodna valaki, hogy mással akarom megcsináltatni a feladatomat ;]

    Tényleg jó lenne, ha megnéznéd, órákon még csak hasonlókat se csináltunk. Ja, hétfőn lesz ZH, úgyhogy ha lehet, addig. :B

    Épp megjöttem egy kis alkoholizálással egybekötött koncertről, épp ideje belenézni a Java topicba :D
    Erre tényleg. Meg is nézem.

  • Olyat lehet csinálni hogy esemény hatására wav file lejátszása? (gombra kattintás vagy ha adott terület felett van a kurzor)

    kód is jöhet :)

    Lehet. Segítségül, ezeket a függvényeket használd.
    javax.sound.sampled csomagból:

    Audio file betöltés: AudioSystem.getAudioInputStream(File),
    Clipre is lesz szükséged: AudioSystem.getClip(),
    az AudioInputStreamet benyomod a clipbe: Clip.open(AudioInputStream),
    lejátszod: Clip.start()

  • jogos, bár ha 6 tizedesjegyig tud számolni akkor már jó.
    (még alatta is, csak mondtam valamit)

    egyébként a Te megoldásod tényleg elegáns, csak az a baj hogy lehetséges kimenet a 10.000 is

    Az állításod hamis, ugyanis az int Random.getInt(int szam) függvény a [0; szam) egész-intervallumban, azaz [0; szam-1]-ben ad számokat egyenletes eloszlással. :)

    [Szerkesztve]

  • Okok. Köszi mindkettőtöknek! Most seggrészeg vagyok, de holnap kipróbálom, plusz lenne 1 kérdésem, amit most szzóban talán el tudnék mondani, de írásbannn :D
    Hát igen, sokat ittam. Ahogy Pázsit barátom mondaná: aki másnak vermet ás, nem kap rétest estére :D
    Na megpróbálkozok. Itt a feladat: Bővebben: link
    3. feladatnál tartok, és a 2. befizet metódussal van problémám.
    Ugye a későbbiekben valószínűleg példányosítani fogom a penzintezet osztályzt. És meghívom a befizet metódust. Ezt a 2.-at. Úgy godolom, hogy olyan objektumot kellene keressek, aminek a szamlaID-je megegyezik a paraméterben kapottal. És utána ezen ojjektum egyenleg adattagját kellene változatnom. Hogy lehet ezt? Vagy én gondolom ezt hülyén? Má beszélni (írni) se tudok, de asszem ezt nem értem. Szóval objektumok adattagjaiban kellene keresgéljek, melyiknek egyezik meg a számlaID-je a paraméterben kapottal. Biztos, hogy hülyén gondolkozok, de ezt már ivás előtt se értettem, szóval ez legyen a mentségem :)
    ó éjt, holnap itt... [ OFF] :D

    Részegség, fél egészség :D

    Teljesen jól gondolkozol, csak láss a szöveg mögé: a Szamla osztálynál nem tiltja meg, hogy csinálj egy int getSzamlaID() metódust, amivel lekérdezheted a kívánt adatot. Sőt, egy int getEgyenleg(), void setEgyenleg(int), de még void addToEgyenleg(int) sincs megtiltva. Hajrá! :)

  • csak parasztosan:

    (random + 1/9 ) * 8999,1

    és persze kerekítés


    [Szerkesztve]

    Az ilyen törtekkel mindig az a baj, hogy a ''valós'' számokat csak akkor tárolja pontosan a gép, ha a legnagyobb és legkisebb nem nulla számjeggyel kitöltött helyiérték (negatív, azaz tört kitevőjű helyiértékeket beleértve) között elég kicsi a különbség. Mondhatnám azt is, hogy kettes számrendszerben _véges_ törtként ábrázolható törteket.
    Azaz csak a 1/2 1/4 1/8 1/16 ... stb és ezekből véges darab, egymáshoz közel állók összege lesz pontos. Próbáld kirakni az 1/9-et. :)

    Ezt még szorzod egy hasonló pontos számmal, kerekíted, meg se bírom becsülni ebből mi sülhet ki :)

  • Hogy lehet int típusú véletlenszámot generálni, ami 4 jegyű! ?

    Találtam ilyet, de ez 0, és a megadott szám között generál egy számot.
    // Random integers that range from from 0 to n
    int n = 10;
    i = rand.nextInt(n+1);

    Előre is köszi.

    BaLinux: nekem ez magas egyelőre :D

    Reflection mondtam hogy advanced topic :D

    Tehát, egyenletes eloszlású int változó [1000; 9999] intervallumban:

    int veletlen=Random.nextInt(9000)+1000;

    Eszetekbe nem jutott hozzáadni egy számot. Érdekes :)

  • jó, akkor hagyjuk, ezt nem vágom


    Tudja valaki, hogy a Netbeans nevezetű programban hogyan lehet egy egyszerű HelloWorld.java-t lefuttatni az általa reklamált main nélkül?
    Maga a helloworld.java-ban van main

    [Szerkesztve]

    Jogosan reklamál, ugyanis a
    public static void main(String[] args)
    függvény a program belépési pontja. Most akkor van ilyen fgv vagy nincs, mert lennie kell.

  • Kösz a választ, végre valaki.
    Igen, új az OO. Amit te írtál, az nem polimorfizmus?
    Nekem mindegyik változó ugyanabba az osztályba tartozik. És mindegyiknek meg akartam változtatni ugyanazt az adattagját. Átírtam én is tömbre, úgy tökéletesen működik, csak ilyen összerakósdira lennék kíváncsi :)
    Nem lehet egy objektum nevét valahogy összerakni stringből?

    Mod:Mellesleg van könyvem: Angster Erzsébet-féle

    [Szerkesztve]

    Jóra gondolsz. Akkor máshogy próbálom meg a dolgot :)
    A Java nem scriptnyelv, nem erre való, tudom csak kíváncsi vagy. Ha valamire ilyen megoldást agyaltál ki, gondolj ki mást, mert nagy valószínűséggel rossz módszer. :)
    Ettől függetlenül van kivétel (pl RPC vagy hasonló dolgok implementálása), és ezért van is megoldás minderre. Nézd meg a Java API doksiban a java.lang.reflect csomag tartalmát, mindent tartalmaz ami a nyelvi reflekcióhoz szükséges lehet. Metódusok, konstruktorok, kivételek, tömbök, mindent tud. Advanced topic!
    Hogy lássad, kb. ennyiből állna a dolog:
    ha van egy Osztaly nevű class-od, annak float function(int) metódusa, és annak egy o1 instance-ja, akkor a következő rész meghívja a függvényt, és a visszatérő értéket is megkapod.

    Method m=Osztaly.getMethod(''function'', new Class[] {int.class});
    Object ret=m.invoke(o1, new Object[] {new Integer(1)});
    float vissza=((Float)ret).floatValue();

    Kész. Persze semmi értelme ennek, mert írhatnád ezt is, ez ugyanaz:

    float vissza=o1.function(1);

    Csak az előbbinél észre se veszed ha elírtad a függvénynevet, vagy bármilyen hibát vétettél, csak futási időben, míg az utóbbinál már fordításnál. A típusbiztonság nagyon fontos a jó programban, úgyhogy törekedni kell rá. :D

  • Tömbbel sikerült könnyedén megoldanom a problémát, de azért még mindig érdekelne a dolog. JavaScriptben már láttam hasonlót, fájl neve lett összerakva két beviteli mező-be írt szövegből. Vagy a 2 dolog teljesen más, még elviekben is :F

    Ha így akarod megcsinálni, akkor levonhatom azt a következtetést hogy új neked az OO szemlélet? :)
    Ja, a javascriptnek annyi köze a java-hoz, hogy kb. semmi.

    Tehát, van két osztályod, és uazt a metódusát akarod meghívni. Tipikus eset az interface-es absztrakcióra:

    interface KozosTudas
    {
    public void fuggeny();
    }

    class Osztaly1 implements KozosTudas
    {
    public void fuggveny() {
    System.out.println(''osztaly1'');
    }
    }

    class Osztaly2 implements KozosTudas
    {
    public void fuggveny() {
    System.out.println(''osztaly2'');
    }
    }

    Ezek után valahol vannak ilyen cuccaink:
    Osztaly1 o1;
    Osztaly2 o2;
    Ezek mindketten implementaljak a KozosTudas-t, tehát:
    KozosTudas[] tomb=new KozosTudas[2]; //hulye pelda...
    tomb[0]=o1; tomb[1]=o2;
    for(int k=0; k<tomb.length; k++) {
    tomb[k].fuggveny();
    }

    SZVSZ keress egy tutorialt ilyen temabol, esetleg ajanlok 1-2 konyvet maganban...

    szerk: kénytelen voltam a ciklusváltozót k-nak nevezni mer amúgy italic-ba nyomta a fórum az egészet ami az indexelés után van :)

    [Szerkesztve]

  • Üdv mindenkinek!
    Légyszi segítsetek, mi lehet a baj, mert megőrjít.
    Az egyik gépre sehogysem tudom feltelepíteni a Java-t(j2sdk-1_4_2_05-windows-i586-p) XP van rajta. Eddig minden XP-s gépre rá tudtam tenni minden gond nélkül, de az aktuális darab a telepítés közben egyszercsak újraindul és ''a rendszer súlyos hiba után állt helyre'' üzenetet adja. Ha a netről telepítem ugyanez a szitu. Mitől lehet ez?
    Köszi:
    poro

    [Szerkesztve]

    Ez a WinXP vs Java elég vicces tud lenni... :)
    Volt már olyan bug, hogy ATI videókártyákkal kifagyott. Esetleg 1.5.0-t nem próbáltad?

  • Hi!

    Jobbklikk, társítás, és beállítod neki, hogy: java -jar -classpath (lehet, hogy nem pontosan ez a sorrend).

    Így van. Ha ''nagyon átlaguserrel'' van dolgod, úgyis készítesz installert, ami beállítja az egészet, tehát bármennyi dolgot kell beállítani, nem számít. :)
    Ja igen, a .jar egy .zip átnevezve, érdemes tudni, nem valami spéci formátum.

  • kösz

    hogy minek? csak elméleti kérdés volt, tényleg most ismerkedek vele, hogy egyáltalán mi ez, és mit tud.

    tudom, hogy ez is láma de:
    általában egy htm fájlba ágyazzák be, és a böngésző futtatja, már ha van JVM?
    gondolom az átlaguser nem parancssorból fogja a java.exe-vel futtatni a .class-t

    Az appletek eléggé speciális kis java osztályok, tehát általában még nem is az applet-írás a Java fő profilja. Kétségtelenül praktikus, viszont spec. én eddig 1 appletet se írtam, de számos standalone applikációt.
    Átlaguser valóban nem úgy indítja, hogy kikeresi a main osztályodat, és java -cp classpath bla.bla.bla.osztaly :)
    A .jar fileok arra valók, hogy abba becsomagolva a lefordított class-aidat és egy kis meta-információt (mit kell indítani benne pl), egyszerűen el lehessen indítani, leginkább duplakatt .jar-ra, ami azt csinálja hogy: java -jar jarfile
    A legjobb megoldás mégiscsak valami script (.bat), ami - ha bonyolult classpath és egyéb beállításaid vannak - megkíméli a usert mindentől. Akár írhatsz is egy kis c(++) progit ami egyszerűen elindítja a java progit.

  • van olyan compiler ami exe-t készít?
    bocs ha tök láma kérdés

    Nincs olyan ami konkrétan .exe-t készít, csak linux/unixra létezik free compiler (gcj), ami elég korlátozott még, az GUI osztályok még nincsenek támogatva, meg béta persze, viszont tényleg natív futtatható állományt készít.
    Kérdés: minek neked ilyen egyáltalán?

  • Ha jól értelmeztem a hsz-ket, akkor ezzel mobilokba lehet programokat írni? Szóljatok, ha nem! És honnan tudnám letolteni? THX

    Mobilokra IS lehet programot írni, igaz az egy nagyon szűk részhalmaza a ''teljes'' változatnak (standard edition), amit pl. PCre használunk.
    Letölteni... a mobilosat? Az nehezebb ügy mert minden mobilgyártónak van egy saját kis szabványa, így legjobb ha a gyártó honlapján keresed. A standard editiont pedig mondjuk java.sun.com.

  • Hogyan lehet Javaban meghatározni, hogy egy file hány sorból áll? Talán végig kell olvasni, és számolni a sorvégeket? Vagy csak soronkén olvasni, és figyelni, hogy mikor dob exceptiont?

    mod: a progiban BufferedReaderrel, soronként olvasom, és nem ott száll el, ahol olvasom n soros file-nél az n+1. sort, hanem csak ott ahol hivatkozok rá. Ebből nem lehet valamit kihozni?

    [Szerkesztve]

    Hát nem értem teljesen a mod részben leírtakat, ha kóddal alátámasztanád, egyszerűbb lenne javítani. BufferedReader hol száll el? Mért? Az exception mechanizmust nem illik/érdemes arra használni, hogy a programod normális lefolyásában vezérlőszerkezet legyen, hanem amire való: kivételes állapotot (amivel az a metódus nem tud mit kezdeni) jelezni és stacken feldobni.
    Amúgy a megoldás kb ennyi:

    int lines=0;
    while(bufferedreader.readLine()!=null) lines++;
    // lines-ban van a sorok száma :)

  • meg a javanal joval boynolultabb nyelveket is meg lehet szokni :))

    A Java szvsz az egyik legegyszerűbb struktúrájú, legátláthatóbb OO nyelv, talnuld meg a C++ rejtélyeit, na az kicsit bonyolultabb, nem sokkal :)

  • Na megszereztem a jbuilder 9.0 programot, full installálosat, ~700mega, és amikor elindítom nem lép be.

    Mi baja van :f xp sp2 van fennt. Nem akar belépni, de eszméletlen ideg vagyok már:(((:(((

    Használj free sun-os JRE-t (java.sun.com), és Eclipse IDE-t (www.eclipse.org). Mindkettő ingyenes, és nagyon minőségi termék. Eclipse-ben meg alapból nincs visual editor, ami nagyon előnyös, ha Java-t akarsz _tanulni_, nem gányolni,

Új hozzászólás Aktív témák

Hirdetés