- Samsung Galaxy Watch5 Pro - kerek, de nem tekerek
- Milyen okostelefont vegyek?
- Hat év támogatást csomagolt fém házba a OnePlus Nord 4
- Telekom mobilszolgáltatások
- Sony Xperia 1 VII - Látod-e, esteledik
- Samsung Galaxy Z Fold7 - ezt vártuk, de…
- Samsung Galaxy S22 és S22+ - a kis vagány meg a bátyja
- Honor Magic5 Pro - kamerák bűvöletében
- Sony Xperia 1 VI - egyből hat
- Netfone
Hirdetés
Ú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?:))
- Diablo IV
- sziku69: Fűzzük össze a szavakat :)
- Samsung Galaxy Watch5 Pro - kerek, de nem tekerek
- Rövid videón az új Virtua Fighter játék
- Jön az Ashes of the Singularity 2
- leslieke: leslieke farmerzsebe
- Nincs kill switch az NVIDIA chipekben
- AMD GPU-k jövője - amit tudni vélünk
- A lemondást javasolja az Intel vezetőjének Donald Trump
- Windows 11
- További aktív témák...
- HIBÁTLAN iPhone 13 Pro 256GB Gold -1 ÉV GARANCIA - Kártyafüggetlen, MS3020, 91% Akkumulátor
- REFURBISHED - HP USB-C Dock G4 docking station (L13899-001)
- Asus ROG Zephyrus G14 GA401IV - 14" FHD 120Hz - Ryzen 9 - 4900HS - 16GB - 2TB - RTX 2060 - Win11
- GYÖNYÖRŰ iPhone 13 mini 128GB Pink -1 ÉV GARANCIA - Kártyafüggetlen, MS3049, 94% Akkumulátor
- BESZÁMÍTÁS! MSI B450M R5 3600 16GB DDR4 512GB SSD GTX 1080 8GB Rampage SHIVA ADATA 600W
Állásajánlatok
Cég: FOTC
Város: Budapest