2013-11-04 6 views
8

द्वारा ऑरेलिस्टिस्ट ऑब्जेक्ट पुनर्प्राप्त करें मान लीजिए मेरे पास मेरे कस्टम ऑब्जेक्ट्स का ArrayList<Account> है जो बहुत आसान है। उदाहरण के लिए:आईडी

class Account 
{ 
public String Name; 
public Integer Id; 
} 

मैं अपने आवेदन के कई हिस्सों में एक Id पैरामीटर के आधार पर विशेष Account वस्तु प्राप्त करना चाहते हैं। इस बारे में जाने का सबसे अच्छा तरीका क्या होगा?

मैं ArrayList विस्तार करने की सोच रहा था लेकिन मुझे यकीन है कि बेहतर तरीका होना चाहिए।

+5

'ArrayList' में सभी तत्वों पर 'मानचित्र' या पुनरावृत्ति का उपयोग करें। –

+0

मानचित्र का उपयोग करें (हैस मैप) या सेट (हैशसेट) इसके बजाय – wxyz

उत्तर

12

ऐसा लगता है कि आप वास्तव में उपयोग करना चाहते हैं Map है, जो आपको एक कुंजी के आधार पर मूल्य पुनर्प्राप्त करने की अनुमति देता है। यदि आप ArrayList पर चिपके रहते हैं, तो आपका एकमात्र विकल्प संपूर्ण सूची के माध्यम से पुन: प्रयास करना और ऑब्जेक्ट की खोज करना है।

कुछ की तरह:

for(Account account : accountsList) { 
    if(account.getId().equals(someId) { 
     //found it! 
    } 
} 

बनाम
accountsMap.get(someId) 

आपरेशन इस तरह की एक Map में O(1), बनाम O(n) एक List में है।

मैं ऐरेलिस्ट को विस्तारित करने की सोच रहा था लेकिन मुझे यकीन है कि बेहतर तरीका होना चाहिए।

आम तौर पर यह खराब डिजाइन है। Effective Java आइटम 16 को बेहतर समझने के लिए पढ़ें - या यह article देखें।

+2

केवल हैश-आधारित मानचित्र आपको 'ओ (1)' लुकअप देंगे। –

+0

मैं सहमत हूं, अच्छी टिप्पणी –

1

ArrayList निहित तत्वों को सॉर्ट नहीं करता है। यदि आप एक ArrayList में एक तत्व की तलाश करना चाहते हैं, तो आपको सूची के माध्यम से लूप करने की आवश्यकता होगी और प्रत्येक व्यक्ति को उस मूल्य से तुलना करें जिसे आप ढूंढ रहे हैं।

Account foundAccount; 
for(Account a : accountList){ 
    if(a.Id == targetID){ 
    foundAccount = a; 
    break; 
    } 
} 
if(foundAccount != null){ 
    //handle foundAccount 
} 
else{ 
    //not found 
} 

वैकल्पिक रूप से, आप एक अधिक बुद्धिमान डेटा संरचना का उपयोग कर सकते हैं जो सॉर्ट करता है और डेटा के बारे में जानकारी रखता है।

आप मानचित्र इंटरफ़ेस, विशेष रूप से हैश मैप कार्यान्वयन का शोध करना चाहते हैं। यह आपको प्रत्येक तत्व को एक निश्चित कुंजी से बंधे क्रम में स्टोर करने देता है। तो आप अपनी प्रत्येक ऑब्जेक्ट को आईडी के साथ हैश मैप में कुंजी के रूप में रख सकते हैं, और उसके बाद आप सीधे हैश मैप से पूछ सकते हैं यदि उसके पास किसी निश्चित कुंजी का ऑब्जेक्ट है या नहीं।

2

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

for(int i = 0; i < sizeOfList; i++) { 
    list.get(i).equals(/* What you compare against */) 
} 

वहाँ भी अन्य for वाक्य रचना है:

for(Account a : accountList) 

आप एक सहायक विधि है कि एक Account लेता है और प्रत्येक मद के सामने यह तुलना में इस पाश डाल सकता है।

आदेशित सूचियों के लिए, आपके पास अधिक कुशल खोज विकल्प हैं, लेकिन आपको कोई फर्क नहीं पड़ता कि कोई खोज लागू करने की आवश्यकता होगी।

1

उदाहरण के लिए मानचित्र का उपयोग करना चाहिए:

private Map<String, int> AccountMap; 
for (String account : accounts) 
      AccountMap.put(account, numberofid); 
1

विस्तार ArrayList आपकी समस्या का एक अच्छा समाधान लगभग कभी नहीं है। यह List का मूल जावा कार्यान्वयन है, जो आपको वस्तुओं को एक विशिष्ट क्रम में स्टोर करने की अनुमति देता है, और उन्हें उनके सूचकांक द्वारा पुनर्प्राप्त करता है।

आप एक अद्वितीय पहचानकर्ता का उपयोग कर सूचकांक तत्वों के लिए सक्षम होना चाहते हैं, तो आप Map में एक नज़र हो सकता है, और इसके कार्यान्वयन HashMap

Map<Integer, Account> का उपयोग करके यह आपकी समस्या का समाधान करने में आपकी सहायता कर सकता है।

  • सम्मिलित करना वस्तुओं: map.put(id, account) बजाय list.add(account)
  • प्राप्त कर रहा है वस्तुओं: map.get(id)

यह सबसे तेजी से कार्यान्वयन किया जाएगा। लेकिन, यदि आप इसे बदल नहीं सकते, आप अभी भी अपने ArrayList के माध्यम से पुनरावृति और सही खाते पा सकते हैं:

for (Account acc : accounts) { 
    if (acc.getId() == yourId) { 
    return acc; 
    } 
} 
throw new NoSuchElementException(); 
1

एक बेहतर यह करने के लिए एक मानचित्र का उपयोग किया जाएगा जिस तरह से।

आपके मामले में, आप निम्नलिखित तरीके

Map<account.getId(), account> 

आप उचित खाते वस्तु पुनः प्राप्त करने के "मिल" विधि का उपयोग कर सकते में इसे लागू कर सकते हैं।

accountMap.get(id);