Hirdetés
- GoodSpeed: Márkaváltás sok-sok év után
- Luck Dragon: Asszociációs játék. :)
- sziku69: Szólánc.
- sziku69: Fűzzük össze a szavakat :)
- gban: Ingyen kellene, de tegnapra
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- [K2]: AnyDesk átverés
- eBay-es kütyük kis pénzért
- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
Új hozzászólás Aktív témák
-
thon73
tag
válasz
Ursache
#6991
üzenetére
Ööö. Ilyesmi csak két nagyságrenddel egyszerűbben.

Az egyik kollégám mondta, hogy Javaban nem programozni kell, csak tudni, hogy hol írták már meg...
Ebben van valami igazság.Nekem két funkció is kellett - "human readable" adatokkal feltöltse az adatstrutúrát (ilyen már van pl. xml), - de (2.) feltöltés közben egyfajta "előkészítő" adatfeldolgozást is végezzen; ha a forrás azt indokolja. Ez utóbbit nem lehet valószínűleg saját kód hozzápasszintása nélkül megoldani...
((A valóságban meg egy hevenyészett (sőt tákolt) tesztkód adta meg az alapötletet, ami átgyúrás után rövid, tömör és tetszetős lett. Bár valaki már biztos ezt is megírta...))Köszönöm a fenti linket, már elkezdtem elmélyedni benne

-
thon73
tag
válasz
Aethelstone
#6988
üzenetére
Konkrétan, használom, azért kellett felfedeznem

Egy speciális szöveget (egyfajta programnyelvet) szeretne feldolgozni a program. A beolvasás minden adat-elemnél közel azonos, csak éppen pl. a String String-ként, a numerikus érték Long-ként érkezik. Az érkező adatelemekről egyébként elég sok mindent tudok, pl. azt is, hogy a numerikusak milyen pontosságúak kell legyenek. Nem csupán java értelemben, hanem pl. ha egy szín jön, az unsigned 32 bittel írható le (ami egyébként belefér egy signed int-be).
Az eredeti megvalósítás ellenőrizte a pontosságot, aztán visszaadott egy - a kívánt pontosságnak megfelelő - Long értéket. Csakhogy, egyszerűbb ha pl. pont a szineknél kapásból egy Integer pontosságú értéket ad vissza, mert akkor nem kell tovább bonyolítani a dolgot az adatot tároló változók szintjén.
Egyébként az egész teljesen prímán működött, amíg a különböző típusokat különböző metódusok szedték elő. Viszont egy közös Object-tel egyetlen átlátható metódusra egyszerűsödött az egész - éppen csak ide-oda kellett volna konvertálnom az adatokat. Na, ez nem ment. Utána meg már az érdeklődés is hajtott.
Bocs, ez kicsit leegyszerűsítette a problémát, de remélem, érthető maradt.
(Mivel nem vagyok profi programozó, azt sem igazán tudtam, hogy mire keressek a googliban. Végül aztán sikerült megtalálni.)
-
thon73
tag
Bocsánat, hogy magamnak válaszolok, de időközben végül egy próbaprogrammal megfejtettem:
Object longobject = 0x0102030405060708L;
long longprimitive = (long)longobject;
// char charprimitive = (char)longobject; -> exception
// int intprimitive = (int)longobject; -> exception
char charprimitive = (char)(long)longobject;
int intprimitive = (int)(long)longobject;
// Character charobject = (Character)longobject; -> exception
// Integer intobject = (Integer)longobject; -> exception
Character charobject = Character.valueOf( (char)((Long)longobject).longValue() );
// (char)(long)longobject;
Integer intobject = (int)(long)longobject;Végülis logikus: a wrapper osztályok (szinte) kizárólag a saját primitivjükkel átjárhatóak (boxing). És csak a primitivek alakíthatóak egymásba (casting), a nem öröklési viszonyban álló objectek nem. (Bár a Long-Object átalakítás szintén casting, ha mindent jól értettem.)
Gondolom, ez itt sokaknak nagyon alap szint; de én azért jól megszenvedtem vele, mire kiolvastam a tudományból, hogy pontosan mi is kell ide meg hogyan működik...
-
thon73
tag
A Long Object "lebutítását" csak így tudtam megoldani:
Object result = getLongValue();
result = (long) result & (long) Character.MAX_VALUE;Működni működik, csak nem tűnik túl szépnek.
Viszont egy lépéssel később megint elakadtam. A "lebutított" értéket át is szeretném pakolni egy másik wrapper osztályba. ((Egy univerzális feldolgozó Object-ként kapja meg az értékeket ((Long a numerikus és String a Stringek számára), és különböző átalakítások, ellenőrzések után ezt kellene visszaadnia, csak éppen a kívánt méretnek megfelelő wrapper osztályba helyezve. Pl. Objekctként numerikus Long érték -> Objectként numerikus Character érték.))
Hogyan tudok egy Objectet, ami bizonyosan egy Long értéket tartalmaz, a lehető legegyszerűbben egy olyan Object-té alakítani, ami Character-t tartalmaz? ((A fordító vagy feleslegesnek látja a próbálkozásaimat, vagy hibaüzenetekkel bombáz.))
-
thon73
tag
válasz
WonderCSabo
#6940
üzenetére
Közben eddig jutottam:
Object result = null;
...
result = getPrimitiveLong(); // long visszatérési érték
// másutt
result = getLong(); // Long visszatérési érték
...
result = (long)result & 0xFFFFFFFFL;Ha itt (Long)-ot írok a (long) helyett, az hülyeség? Aritmetikai műveletet csak primitivek csinálnak? És ezt: &=, gondolom, felejtsem el.
Egyébként a fenti jó.Amikor viszont ezt írom:
result = (long)result & Character.MAX_VALUE;
Akkor azt mondja, hogy "Reports pointless bitwise expressions..."
Ez miért van? Nem long-ra alakít mindent, ha az egyik long??Bocs, hogy ennyit kérdezek, de wrapper osztályt idáig tényleg csak wrapper-ként használtam, és nem dolgoztam vele.
-
thon73
tag
Sziasztok!
Elakadtam egy arithmetikai problémával:
Egy érték egyaránt lehet String vagy különböző pontosságú numerikus érték, ezért Object-ként tárolom. (A program egyébként tudja, hogy melyik van benne.)
Tegyük fel, hogy egy long pontosságú szám van benne, amit szeretnék char pontosságúra korlátozni. (Csak az alsó bitek érdekesek.)
Primitív típussal ezt tenném:
value &= Character.MAX_VALUE;
De hogyan tudom ezt egy wrapper-rel elérni, pláne úgy, hogy Object-ként van definiálva eredetileg?
((Az autoboxingnál azt olvastam, hogy lehet ilyet, de nem sikerült.))
Köszönöm!
Új hozzászólás Aktív témák
A topicot kiemeltem. Valaki nem akar egy nyitó hsz-t írni?:))
- ARCTIC Liquid Freezer III 360 A-RGB Processzor vízhűtő
- Phanteks Eclipse P600S Black Számítógép ház
- Corsair 32GB KIT DDR5 6000MHz CL30 Vengeance RGB Grey AMD EXPO / XMP
- Iphone 16 PRO 256GB Titanium BLACK - Garanciás - Akku: 94%
- Esport Gaming PC (Intel i5-9400F, 32GB RAM, RTX 2060, 500GB SSD) Eredeti Windows11 Pro
- Honor Magic 7 Pro 512 Gb - AI Pro kamera, 6,8 120 Hz LTPO OLED, Snapdragon 8 Elite,3 hó gari!
- iPhone 12 Pro Max emelt kapacitású 4530mAh diagnosztizálható akkumulátor, +ajándék ragasztó
- GYÖNYÖRŰ iPhone 13 Pro 256GB Sierra Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3360, 100% Akkumulátor
- Kaspersky, BitDefender, Avast és egyéb vírusírtó licencek a legolcsóbban, egyenesen a gyártóktól!
- Készpénzes / Utalásos Számítógép felvásárlás! Személyesen vagy Postával!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: ATW Internet Kft.
Város: Budapest




)

