2011-11-19 21 views
29

जाहिर है, जावा अनुक्रमित संख्या प्रकारों को मूल रूप से, and that's not going to change soon (2002 में शुरू होने वाली टिप्पणियों) का समर्थन नहीं करता है। हालांकि, डेटाबेस के साथ काम करते समय, जैसे कि MySQL, वे हर समय और फिर काम में आ सकते हैं। हस्ताक्षर किए गए नंबरों को अनुकरण करने के तरीके से निपटने के बहुत सारे प्रश्न हैं। उदाहरण के लिए:क्या हस्ताक्षर किए गए नंबर प्रकार रैपर के लिए जावा लाइब्रेरी है?

वे सब के सब अल्पज्ञता का वर्णन यह कैसे किया जा सकता है। लेकिन क्या वास्तव में कोई पुस्तकालय सभी तरह से जा रहा है और UByte, UShort, UInteger, ULong के लिए उपयुक्त रैपर लागू कर रहा है? अधिमानतः, उन रैपर java.lang.Number का विस्तार करेंगे और java.math.BigInteger के समान अंकगणितीय API प्रदान करेंगे।

जैसा कि this document में देखा जा सकता है, वहां बहुत कुछ सोचने के लिए बहुत कुछ है, और बहुत कुछ गलत हो सकता है (उदाहरण के लिए बिटवॉफ्ट शिफ्ट, कैसे गुणा करना है, आदि), इसलिए मैं इसे स्वयं नहीं करना चाहता हूं। साथ ही, मैं केवल अगले उच्च प्रकार (उदाहरण के लिए ShortByte इत्यादि के बजाय उपयोग नहीं करना चाहता)। उदाहरण के लिए, मुझे डेटाबेस के साथ सर्वोत्तम बातचीत के लिए 8-bit, 16-bit, 32-bit, 64-bit नंबर की संरक्षितता की धारणा चाहिए।

अद्यतन:

इससे पहले कि आप का जवाब! इस बात पर विचार करें कि मैं सभी कामकाजों को जानता हूं, लेकिन मैं वास्तव में वास्तव में उन उपरोक्त गुणों के साथ वास्तव में उन 4 प्रकारों को देखना चाहता हूं। और शायद किसी ने पहले ही ऐसा कर लिया है, इसलिए मैं पूछता हूं। कामकाज की याद दिलाने की कोई ज़रूरत नहीं है।

+4

हस्ताक्षर किए गए हस्ताक्षर किए गए भूमि को चलाने के लिए थोड़ा झुकाव की सभी चेतावनी, "संख्याओं की तरह काम करने वाली संख्या" आमतौर पर मुझे दूर करने के लिए पर्याप्त नहीं होगी। कुछ क्षेत्र जावा अभी याद किए गए थे, यह उनमें से एक है। –

+0

@pst: मुझे वही लगता है। ज्यादातर मामलों में मैं भी दूर हो गया हूँ। लेकिन इस मामले में, ऐसी पुस्तकालय वास्तव में एक इलाज होगा। –

+1

कुछ समय पहले मैंने [javolution] (http://javolution.org/target/site/apidocs/javolution/io/Struct.html) स्ट्रक्चर क्लास के साथ लाइब्रेरी से मुलाकात की जिसमें 8-, 16-, 32-बिट के कार्यान्वयन शामिल थे। – 87element

उत्तर

26

जब मैं jOOQ के अंदर इस कार्यक्षमता की जरूरत है, मैं इसे ऐसा कुछ नहीं मिला है, इसलिए मुझे लगता है कि मैं (अहस्ताक्षरित के लिए यू) jOOU फोन अपने ही मुक्त स्रोत पुस्तकालय लुढ़का:

http://github.com/jOOQ/jOOU

मैं समझते हैं कि कुछ सोच सकते हैं कि यह अधिक है, लेकिन मैं वास्तव में उन रैपरों को लपेटना चाहूंगा जो अन्य भाषाओं को ubyte, ushort, uint, ulong पर कॉल करना चाहते हैं। उम्मीद है कि वालहल्ला के साथ, उन रैपरों को मूल्य प्रकारों में बदल दिया जा सकता है।

बेशक, अंकगणित/बिटवाई ऑपरेशन कार्यान्वयन में योगदान बहुत स्वागत है!

2

समाधान जो कि बिना किसी हस्ताक्षर की सरणी के लिए कॉमन्स-प्राइमेटिव्स में उपयोग किया जाता है, इसे लंबे समय तक पास करने के लिए इसे एक हस्ताक्षरित int के रूप में नहीं माना जाता है। आप और अधिक यहाँ पढ़ सकते हैं:

http://commons.apache.org/primitives/apidocs/org/apache/commons/collections/primitives/ArrayUnsignedIntList.html

+0

धन्यवाद, मैं उन सभी आंशिक समाधानों से अवगत हूं। कई पुस्तकालयों ने हस्ताक्षरित संख्या प्रकारों के लिए 1-2 कदम उठाए हैं। लेकिन मैं वास्तव में एक पुस्तकालय की तलाश कर रहा हूं जो मैंने प्रश्न में वर्णित किया है, जो कि अंकगणित समेत सभी तरह से जाता है ... –

19

वहाँ कुछ कारण हैं क्यों कोई जिस तरह से आप चाहते हैं में इन रैपर बनाया।

  • प्रदर्शन
  • कचरा कलेक्टर भूमि के ऊपर
  • कोई autoboxing/
  • बुरा/बेकार इंटरफ़ेस unboxing। इसके साथ

मौजूद निपटने के लिए

  • आसान तरीके पहले चार अंक एक छोटे सी उदाहरण के द्वारा प्रदर्शन कर रहे हैं:

    UInteger m = new UInteger(5); 
    UInteger t = new UInteger(18); 
    UInteger x = new UInteger(42); 
    
    UInteger y = x.multiplyBy(m); 
    y = y.add(t); 
    

    कई आवरण:

    unsigned int x=42, y, m=5, t=18; 
    y = x * m + t; 
    

    इस में अनुवाद किया जाएगा वस्तुओं को बनाया जाना चाहिए, multiplyBy और add कुछ और उत्पन्न करेंगे। यदि इस तरह की कई गणनाएं की जाती हैं तो यह कचरा कलेक्टर पर काफी बोझ डाल देगा।लपेटने और अनचाहे भी आपके सीपीयू को कुछ भी नहीं खाएंगे।

    यह भी सरल अंकगणित लिखने या पढ़ने के लिए एक पिटा है यह भी स्पष्ट है।

    इसी कारण से नोबॉडी हस्ताक्षरित रैपर प्रकारों का उपयोग करके अंकगणित करता है। अगर आप अगली बड़ा हस्ताक्षर किए प्रकार का उपयोग कर गणना करने और इस तरह ऊपरी हिस्सा कट

    यह सब

    अनावश्यक है:

    जावा और एक डेटाबेस के बीच
    long x=42, y, m=5, t=18 
    y = (x*m + t) & 0xFFFFFFFF; 
    

    स्थानांतरण भी अगले सबसे बड़ी उपयोग किया जा सकता हस्ताक्षरित प्रकार और चूंकि जेडीबीसी इन हस्ताक्षरित रैपर प्रकारों को नहीं बनाएगा, इसलिए आपको केवल अपने आप को डेटा को केवल हस्ताक्षरित रैपर में बदलने के लिए ही करना होगा।

    मैंने अपने लिए कुछ सीपीयू गहन डेटा प्रोसेसिंग किया है और बाइनरी प्रोटोकॉल को संभाला है। इन अवसरों पर मैंने कामना की थी कि मैंने डेटाटाइप को भी हस्ताक्षर नहीं किया था। लेकिन उन्हें जावा में रैपर प्रकारों के साथ अनुकरण करना प्रत्येक एकल अवसर पर सीधे समस्या से निपटने से अधिक समस्याग्रस्त हो गया होगा।

  • +2

    मैं मानता हूं, यह केवल "बदसूरत" हो जाता है जब बाइनरी प्रोटोकॉल हस्ताक्षरित 64 बिट पूर्णांक का उपयोग करता है .. हैलो BigInteger :( – Voo

    +0

    आपके पास अच्छे अंक हैं। दूसरी तरफ, कभी-कभी आपको * 'BigInteger' और/या 'BigDecimal' की आवश्यकता होती है। फिर आपके पास कोई विकल्प नहीं है लेकिन उस वर्बोज़ एपीआई का उपयोग करें। और इसी कारण से , यदि आपको * 'UInteger' की आवश्यकता है, तो इसका उपयोग क्यों न करें अगर यह उपलब्ध हो? और यदि आप गति के लिए हैं, तो आप अभी भी गणना कर सकते हैं ... मैं वर्तमान में मूल्यांकन कर रहा हूं कि मैं चाहता हूं कि मैं http://www.jooq.org के लिए ऐसे रैपर का उपयोग करें, या कोई अन्य तरीका है ... मेरे मामले में, गति शायद कोई समस्या नहीं है। –

    +0

    @ लुकासएडर आप जानते हैं कि आप अभी भी अंकगणित का उपयोग कर कर सकते हैं BigInteger wrapper (64 बिट हस्ताक्षरित के लिए) और बाकी सब कुछ के लिए अगला बड़ा मूल्य और बस बताओ मूल्यों को सही ढंग से स्टोर करने के लिए डीबी? मुझे वास्तव में यकीन है कि आप वास्तव में कम से कम कुछ डीबी के लिए ऐसा कर सकते हैं। – Voo

    1

    विचार करने के लिए एक और लाइब्रेरी Google की Guava है। यह निम्न अहस्ताक्षरित प्रकार का समर्थन करता:

    वे संख्या का विस्तार करने और अंकगणितीय आपरेशनों लागू करते हैं।

    +0

    किसी कारण से, अमरूद में 'ushort' और' ubyte' प्रकार नहीं हैं। विशेष रूप से 'ubyte' सबसे उपयोगी है। तुम जानते हो क्यों? –

    +0

    'लघु' के लिए उठाई गई कोई समस्या है: https://code.google.com/p/guava-libraries/issues/detail?id=670, 'बाइट' के लिए 'बिना हस्ताक्षर किए गए बाइट्स' – Andrejs

    +0

    हाँ, लेकिन केवल 'बिना हस्ताक्षर किए गए बाइट्स' 'बाइट 'हेरफेर के लिए स्थिर तरीके प्रदान करता है ... –

    2
    // Java 8 
        int vInt = Integer.parseUnsignedInt("4294967295"); 
        System.out.println(vInt); // -1 
        String sInt = Integer.toUnsignedString(vInt); 
        System.out.println(sInt); // 4294967295 
    
        long vLong = Long.parseUnsignedLong("18446744073709551615"); 
        System.out.println(vLong); // -1 
        String sLong = Long.toUnsignedString(vLong); 
        System.out.println(sLong); // 18446744073709551615 
    
        // Guava 18.0 
        int vIntGu = UnsignedInts.parseUnsignedInt(UnsignedInteger.MAX_VALUE.toString()); 
        System.out.println(vIntGu); // -1 
        String sIntGu = UnsignedInts.toString(vIntGu); 
        System.out.println(sIntGu); // 4294967295 
    
        long vLongGu = UnsignedLongs.parseUnsignedLong("18446744073709551615"); 
        System.out.println(vLongGu); // -1 
        String sLongGu = UnsignedLongs.toString(vLongGu); 
        System.out.println(sLongGu); // 18446744073709551615