2009-05-20 29 views
7

मेरे पास एक ट्रीसेट है, जो पूर्णांक से भरा होगा। एक लंबी कहानी कम करने के लिए, मैं सूची में संग्रहीत अंतिम (महानतम) मान के बाद शुरू करने की कोशिश कर रहा हूं। क्या मैं अब शुरू करने चर प्राप्त करने के लिए कर रहा हूँ है:जावा ऑब्जेक्ट int: एक बेहतर तरीका है?

Object lastObj = primes.last(); 
    Integer last = new Integer(lastObj.toString()); 
    int start = 1 + last.intValue(); // the added 1 is just for program logic 

मुझे यकीन है कि वहाँ एक वस्तु (जो मैं हमेशा एक पूर्णांक हो जाएगा पता है) पूर्णांक में कास्ट करने के लिए एक बेहतर तरीका होना चाहिए हूँ 'शुरू '। किसी को ऐसा करने का बेहतर तरीका पता है?

उत्तर

8

आप जावा संस्करण 1.6 का उपयोग कर रहे हैं? उस स्थिति में आप कोड को साफ करने के लिए ऑटोबॉक्सिंग और जेनेरिक का लाभ उठा सकते हैं।

पहले, TreeSet के रूप में युक्त घोषित किया जा सकता केवल पूर्णांक वस्तुओं

TreeSet<Integer> primes; 

अब सेट से वस्तु प्राप्त करने के लिए आप

Integer last = primes.last(); 

और autoboxing सुविधा का उपयोग कर आप

प्राप्त कर सकते हैं
int start = 1 + last; 
+6

आप बस कर सकते हैं, int start = 1 + primes.last(); –

+1

यह लिखने के लिए भी कम कोड होगा ... लेकिन जेनेरिक सुधारों को चित्रित करने के लिए ऑटोबॉक्सिंग सुधारों को स्पष्ट करने के लिए उन्हें इस उत्तर के लिए अलग-अलग बयान के रूप में छोड़ना सबसे अच्छा है –

+0

हाँ, मैं देखता हूं कि आप कहां से आ रहे हैं। सिर्फ एक टिप्पणी के रूप में मेरी टिप्पणी पोस्ट की। –

8

जे 2 एसई 5 में या बाद में यह "ऑटोबॉक्सिंग" सुविधा के साथ स्वचालित रूप से होता है।

int start = 1 + last; 

http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

इसके अलावा, अगर आप जानते हैं कि वे सब, पूर्णांक वस्तुओं हो पैरामिट्रीकृत प्रकार का उपयोग करने जा रहे हैं:

List<Integer> obj = new ArrayList<Integer>()... 

फिर autoboxing सुविधा के साथ यह गठबंधन:

int start = 1 + obj.last(); 
+2

ऑटोबॉक्सिंग के लिए मेरा एकमात्र आपत्ति ऐसी परिस्थितियां है जहां आप इनट्स के साथ काम करने के लिए "प्रकट" होते हैं, इसलिए आप एक == तुलना करते हैं जो अपेक्षाकृत मूल्य तुलना के बजाय एक संदर्भ तुलना है। –

+0

रयान, मैंने सोचा कि अगर आपने int == इंटीजर की कोशिश की है, तो इंटीजर एक int में ऑटोबॉक्स करेगा और जावा दो प्राइमेटिव की तुलना करेगा। –

+0

कितना सच है। हर बार जब आप स्वचालित रूप से कुछ हो रहा है, तो आप उस विचार की एक और परत जोड़ते हैं जो आपके सिर के पीछे हो रहा है। सी ++ ऑटो जेनरेट कन्स्ट्रक्टर! – jbm

4

यदि आप जानते हैं कि वे 'int' थे जब उन्हें रखा गया था, तो वे tr थे संग्रह में रहते हुए पूर्णांक के उत्तर में (संग्रह में प्राइमेटिव, केवल ऑब्जेक्ट्स नहीं हो सकते हैं), इस तरह, आप बस Integer last = (Integer)lastObj; कर सकते हैं।

आदर्श रूप से, आप TreeSet<Integer> का उपयोग करेंगे और फिर यह आपको पहले स्थान पर केवल इंटीजर खिलाएगा।

3

पोस्ट जावा 1.4, आप autoboxing का उपयोग कर सकते हैं।

तो यह हो जाता है,

int start = 1 + (Integer) primes.last(); // the added 1 is just for program logic 

यदि आप अपने TreeSet (TreeSet<Integer>) के साथ जेनरिक इस्तेमाल किया आप पूर्णांक के लिए प्रारंभिक संयोजन हटा सकता है।

2

आप इसे क्यों नहीं डाल सकते हैं, बल्कि एक स्ट्रिंग में कनवर्ट करना, फिर उस स्ट्रिंग को पार्स करना और नया संदर्भ बनाना?

Object lastObj = primes.last(); 
int start = 1 + ((Integer)lastObj).intValue(); 
4

यदि आप जानते हैं कि primes केवल पूर्णांक धारण कर रहा है, तो आपको बनाना चाहिए primesTreeSet<Integer> में।

यह तो बन गयी:

int start = 1 + primes.last().intValue(); 

आप उपयोग नहीं कर सकते जेनरिक इस का उपयोग करें:

int start = 1 + ((Integer)prime.last()).intValue(); 

एक स्ट्रिंग में कास्टिंग सिर्फ मूर्ख होगा।

वैसे, मैं ऑटोबॉक्सिंग का उपयोग करने का सुझाव नहीं देता हूं। यह आपकी पीठ के पीछे सभी प्रकार की चीजें करता है। स्पष्ट रूप से Integer का उपयोग करके मुझे स्पष्ट लगता है। लेकिन यह सिर्फ मेरी व्यक्तिगत वरीयता है, यदि आप चाहें तो ऑटोबॉक्सिंग का उपयोग कर सकते हैं।

+0

Autoboxing भाषा में बनाया गया है; आप इसका उपयोग न करने का चयन नहीं कर सकते हैं। मैं केवल विपरीत के बारे में सलाह देता हूं: कभी भी इंटेगर के रूप में कुछ भी नहीं (चर, विधि तर्क, इत्यादि) घोषित करें यदि आप इसके बजाय int का उपयोग कर सकते हैं (nd यह अन्य आदिम प्रकारों के लिए भी जाता है)। ब्लॉच प्रभावी जावा 2 में एक ही सलाह देता है। –

+0

@Alan एम: जाहिर है, जब आप संभव हो तो इंटीजर की बजाय int का उपयोग करना चाहते हैं, लेकिन मैं हमेशा रूपांतरण को स्पष्ट करने का सुझाव दूंगा, ताकि आप जान सकें कि आप इसे कब कर रहे हैं। – Zifre

संबंधित मुद्दे