2010-04-13 19 views
7

में नए पूर्णांक वस्तुओं की तुलना मैं पूर्णांक वस्तुओं वस्तुओं मैं ट्रैक करना चाहते हैं के एक सूचकांक का प्रतिनिधित्व करने के संचय कर रहा हूँ। बाद में मेरे कोड में मैं यह देखने के लिए जांचना चाहता हूं कि कोई विशेष ऑब्जेक्ट इंडेक्स पहले से संग्रहीत उन इंटीग्रियों में से एक से मेल खाता है या नहीं।ArrayList प्रश्न

ArrayList<Integer> courseselectItems = new ArrayList(); 

//Find the course elements that are within a courseselect element and add their indicies to the ArrayList 
for(int i=0; i<numberElementsInNodeList; i++) { 
    if (nodeList.item(i).getParentNode().getNodeName().equals("courseselect")) { 
     courseselectItems.add(new Integer(i)); 
    } 
} 

मैं फिर बाद में जांच करने के लिए करता है, तो ArrayList एक विशेष सूचकांक में शामिल हैं:: मैं एक ArrayList बनाने और पाश के लिए एक के सूचकांक से एक नया पूर्णांक बनाने के द्वारा यह कर रहा हूं

//Cycle through the namedNodeMap array to find each of the course codes 
for(int i=0; i<numberElementsInNodeList; i++) { 
    if(!courseselectItems.contains(new Integer(i))) { 
     //Do Stuff 
    } 
} 

मेरे सवाल है, जब मैं new Integer(i) का उपयोग कर रहा ArrayList.contains() का उपयोग कर पूर्णांकों की तुलना करने में सक्षम हो जाएगा द्वारा एक नई पूर्णांक बनाने है? यही कारण है, कहने के लिए जब मैं new Integer(i) का उपयोग कर एक नई वस्तु बनाने, कि पूर्व में बने पूर्णांक वस्तु के रूप में ही हो सकता है अगर पूर्णांक मान बनाने के लिए उन्हें एक ही कर रहे हैं प्रयोग किया जाता है?

मुझे आशा है कि मैं यह भी स्पष्ट नहीं नहीं किया। सहायता के लिए धन्यवाद!

+2

एक साइडेनोट पर, यहां इंटेजर्स और स्ट्रिंग्स के बारे में जानने योग्य कुछ है: http://www.devx.com/tips/Tip/42276 –

उत्तर

17

List.contains() कि के रूप में हाँ, आप उपयोग कर सकते हैं equals() उपयोग करता है और एक Integer का समर्थन करता है कि जब अन्य Integer रों की तुलना में।

इसके अलावा, ऑटो मुक्केबाजी की वजह से आप बस लिख सकते हैं:

List<Integer> list = new ArrayList<Integer>(); 
... 
if (list.contains(37)) { // auto-boxed to Integer 
    ... 
} 

ऐसा नहीं है कि उल्लेख के लायक है:

List list = new ArrayList(); 
list.add(new Integer(37)); 
if (list.contains(new Long(37)) { 
    ... 
} 

होगा हमेशा वापसी false क्योंकि एक Integer एक Long नहीं है। यह किसी बिंदु पर ज्यादातर लोगों को यात्रा करता है।

अन्त में, कोशिश करते हैं और अपने चर इंटरफ़ेस प्रकार नहीं ठोस प्रकार इतनी के जावा संग्रह कर रहे हैं:

List<Integer> courseselectItems = new ArrayList(); 

नहीं

ArrayList<Integer> courseselectItems = new ArrayList(); 
+0

धन्यवाद! क्या कोई विशेष कारण है कि मैं इंटरफ़ेस प्रकार के अपने चर बनाना चाहता हूं, न कि कंक्रीट प्रकार? – ericso

+1

@thechiman कंक्रीट प्रकार एक कार्यान्वयन विस्तार है। * आम तौर पर बोलने * पैरामीटर, स्थानीय चर और वर्ग के सदस्यों को इंटरफ़ेस होना चाहिए ताकि आप किसी विशेष कार्यान्वयन से बंधे न हों। यह आपको उदाहरण के लिए, कुछ बाद के बिंदु पर कस्टम 'सूची' कार्यान्वयन को प्लग करने की अनुमति देता है, आदि – cletus

+0

यह सूची इतना महत्वपूर्ण नहीं है कि 'सूची' कक्षा के लिए पूरी तरह से निजी है, कहीं और दिखाई नहीं दे रहा है। लेकिन अगर आप इसे किसी तरह से उजागर कर रहे हैं (उदाहरण के लिए, सूची वाले वर्ग में सूची वापस करने का एक तरीका है), तो आपको निश्चित रूप से इसे 'सूची' के रूप में वापस कर देना चाहिए, न कि 'ऐरेलिस्ट' के रूप में। आप बाद में निर्णय ले सकते हैं, उदाहरण के लिए, 'लिंक्डलिस्ट' एक और उचित कार्यान्वयन है। –

1

लघु जवाब है हां, तो आप में सक्षम होना चाहिए ArrayList.contains(new Integer(14)) करें, उदाहरण के लिए, यह देखने के लिए कि 14 सूची में है या नहीं। इसका कारण यह है कि इंटेगर equals विधि को उसी मान के साथ अन्य उदाहरणों के विरुद्ध सही ढंग से तुलना करने के लिए ओवरराइड करता है।

1

हां यह होगा, क्योंकि List.contains() ऑब्जेक्ट की तुलना करने के लिए equals() विधि का उपयोग करें। और Integer.equals() पूर्णांक मान की तुलना करता है।

0

हाँ, स्वत: मुक्केबाजी होता है, लेकिन इस निष्पादन दंड का परिणाम है। यह आपके उदाहरण से स्पष्ट नहीं है कि आप इस तरीके से समस्या को हल क्यों करना चाहते हैं।

इसके अलावा, मुक्केबाजी की वजह से, हाथ से पूर्णांक वर्ग बनाने ज़रूरत से ज़्यादा है।

1

चूंकि क्लेटस और डीजे का उल्लेख है, आपका दृष्टिकोण काम करेगा।

मैं अपने कोड के संदर्भ पता नहीं है, लेकिन यदि आप विशेष रूप से सूचकांक के बारे में परवाह नहीं है, निम्नलिखित शैली भी विचार: मैं के रूप में मेरा उत्तर डाल रहा हूं

List<Node> courseSelectNodes = new ArrayList<Node>(); 

//Find the course elements that are within a courseselect element 
//and add them to the ArrayList 
for(Node node : numberElementsInNodeList) { 
    if (node.getParentNode().getNodeName().equals("courseselect")) { 
     courseSelectNodes.add(node); 
    } 
} 

// Do stuff with courseSelectNodes 
for(Node node : courseSelectNodes) { 
    //Do Stuff 
} 
+0

मुझे यह भी पसंद है। मैं ऐसा करने के लिए अपना कोड बदल सकता हूं। धन्यवाद! – ericso

+0

मैंने अपना कोड बदलकर ऐसा कुछ करने के लिए बदल दिया। धन्यवाद! – ericso

1

एक (उत्तीर्ण) परीक्षण, उदाहरण के रूप में आप इसे स्वयं कैसे खोज सकते हैं। एसओ का उपयोग करने से आपको हतोत्साहित नहीं करना - यह बहुत अच्छा है - बस characterization tests को बढ़ावा देने का प्रयास करें।

import java.util.ArrayList; 
import junit.framework.TestCase; 

public class ContainsTest extends TestCase { 
    public void testContains() throws Exception { 
     ArrayList<Integer> list = new ArrayList<Integer>(); 
     assertFalse(list.contains(new Integer(17))); 
     list.add(new Integer(17)); 
     assertTrue(list.contains(new Integer(17))); 
    } 
} 
+0

हाँ, अब जब मैं इसके बारे में सोचता हूं, तो मैं आसानी से इसका परीक्षण कर सकता था। हे, मुझे गूंगा लगता है। धन्यवाद। :) – ericso

4

मेरा प्रश्न है, जब मैं नई पूर्णांक (i) का उपयोग करके एक नया पूर्णांक बनाने मैं ArrayList.contains का उपयोग कर पूर्णांकों की तुलना करने में सक्षम हो जाएगा()? ऐसा कहने के लिए, जब मैं नए इंटीजर (i) का उपयोग करके एक नया ऑब्जेक्ट बनाता हूं, तो क्या यह पहले बनाए गए इंटीजर ऑब्जेक्ट जैसा ही होगा यदि उन्हें बनाने के लिए उपयोग किए गए int मान समान हैं?

कम जवाब है हां।

लंबे जवाब है ...

, कहने के लिए जब मैं नई पूर्णांक (i) का उपयोग कर एक नई वस्तु बनाने, कि पूर्व में बने पूर्णांक वस्तु अगर के रूप में ही हो जाएगा कि उन्हें बनाने के लिए इस्तेमाल किया जाने वाला int मान वही है?

मुझे लगता है तुम्हारा मतलब "... कि के रूप में ही उदाहरण हो जाएगा ..."? इसका उत्तर नहीं - कॉलिंग new हमेशा पिछले उदाहरण से अलग एक अलग उदाहरण बनायेगा, भले ही कन्स्ट्रक्टर पैरामीटर समान हों।

हालांकि, अलग पहचान होने के बावजूद इन दोनों वस्तुओं बराबर मूल्य, अर्थात बुला .equals() उन दोनों के बीच सही वापस आ जाएगी होगा।

Collection.contains()

यह पता चला बराबर मूल्य का अलग उदाहरणों (.equals() रिटर्न सच) ठीक है होने कि। .contains() विधि Collection इंटरफ़ेस में है। .contains() के लिए जावाडोक वर्णन कहते हैं: अगर यह संग्रह निर्दिष्ट तत्व शामिल

http://java.sun.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)

बूलियन (वस्तु ओ)

रिटर्न सच होता है। अधिक औपचारिक रूप से, सच (ओ == बातिल ई == बातिल : o.equals (ई)) रिटर्न यदि और केवल यदि इस संग्रह कम से कम एक तत्व ई ऐसी है कि शामिल

इस प्रकार, यह तुम क्या चाहते हो जाएगा।

डेटा संरचना

तुम भी विचार करना चाहिए कि आप सही डेटा संरचना है या नहीं।

क्या सूची पूरी तरह से रोकथाम के बारे में है? क्या आदेश महत्वपूर्ण है? क्या आप डुप्लिकेट की परवाह करते हैं? चूंकि एक सूची आदेश है, इसलिए एक सूची का उपयोग करके यह संकेत हो सकता है कि आपका कोड ऑर्डर करने की परवाह करता है। या आपको डेटा संरचना में डुप्लिकेट बनाए रखने की आवश्यकता है।

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