2009-06-12 20 views
15

में खोज मैं अपने आईडी नंबर से ArrayList में किसी ग्राहक को खोजने का सबसे अच्छा तरीका जानने का प्रयास कर रहा हूं। नीचे दिया गया कोड काम नहीं कर रहा है; संकलक मुझे बताता है कि मुझे return कथन याद आ रहा है।जावा ArrayList

Customer findCustomerByid(int id){ 
    boolean exist=false; 

    if(this.customers.isEmpty()) { 
     return null; 
    } 

    for(int i=0;i<this.customers.size();i++) { 
     if(this.customers.get(i).getId() == id) { 
      exist=true; 
      break; 
     } 

     if(exist) { 
      return this.customers.get(id); 
     } else { 
      return this.customers.get(id); 
     } 
    } 

} 

//the customer class is something like that 
public class Customer { 
    //attributes 
    int id; 
    int tel; 
    String fname; 
    String lname; 
    String resgistrationDate; 
} 
+12

मुख्य जावा अच्छे व्यवहारों में से एक हमेशा ब्रेसिज़ का उपयोग करना है, भले ही आपके पास –

उत्तर

16

संकलक शिकायत कर रहा है क्योंकि वर्तमान में आपके पास लूप के अंदर 'अगर (मौजूद)' ब्लॉक है। इसे इसके बाहर होना चाहिए।

for(int i=0;i<this.customers.size();i++){ 
     if(this.customers.get(i).getId() == id){ 
      exist=true; 
      break; 
     } 
} 

if(exist) { 
    return this.customers.get(id); 
} else { 
    return this.customers.get(id); 
} 

कहा जा रहा है कि इस खोज को करने के बेहतर तरीके हैं। निजी तौर पर, अगर मैं एक ऐरेलिस्ट का उपयोग कर रहा था, तो मेरा समाधान उस तरह दिखता है जो जॉन स्कीट ने पोस्ट किया है।

+0

जैसी समस्याओं से बचने के लिए ब्लॉक में केवल एक वाक्य है, हां मैंने इसे सुधार लिया है और अब यह अधिक स्पष्ट है –

+0

मुझे दृढ़ता से संदेह है कि कोड अभी भी टूटा हुआ है (नोट ग्राहकों के लिए तर्क। अंत में भूल जाओ)। तथ्य यह है कि इसमें अभी भी "अगर/अन्य" है जहां दोनों शाखाओं का एक ही कोड है, वह भी बहुत संदिग्ध है! –

+0

मैं सहमत हूं, जॉन। इसके अलावा, खोज करने के लिए निश्चित रूप से बेहतर तरीके हैं (जैसा कि कई अन्य पोस्टर संकेतित हैं)। –

10
Customer findCustomerByid(int id){ 
    for (int i=0; i<this.customers.size(); i++) { 
     Customer customer = this.customers.get(i); 
     if (customer.getId() == id){ 
      return customer; 
     } 
    } 
    return null; // no Customer found with this ID; maybe throw an exception 
} 
+0

को निष्पादित करना जारी रखने वाला नहीं है यदि विधि को ठीक करने के लिए कथन पर्याप्त नहीं है। आपका समाधान पसंद है। +1 – waxwing

+0

मैं काफी सहमत हूं। +1 –

2

आप क्योंकि अपनी सूची का आकार 0 है अगर वापसी कथन भूल रहे हैं, पाश के लिए, पर अमल कभी नहीं होगा इस प्रकार यदि कभी नहीं चलेंगे, और इस तरह तुम वापस कभी नहीं होगा।

लूप के बाहर दिए गए कथन को ले जाएं।

48

अन्य ने आपके मौजूदा कोड में त्रुटि की ओर इशारा किया है, लेकिन मैं दो कदम आगे लेना चाहता हूं। सबसे पहले, आपको जावा 1.5+ का उपयोग कर रहे संभालने, आप का उपयोग कर अधिक से अधिक पठनीयता को प्राप्त कर सकते पाश के लिए बढ़ाया:

Customer findCustomerByid(int id){  
    for (Customer customer : customers) { 
     if (customer.getId() == id) { 
      return customer; 
     } 
    } 
    return null; 
} 

यह भी पाशन से पहले null लौटने की सूक्ष्म अनुकूलन हटा दिया गया है - मुझे लगता है कि तुम पर शक ' इससे कोई फायदा मिलेगा, और यह अधिक कोड है। इसी प्रकार मैंने exists ध्वज हटा दिया है: जैसे ही आप जानते हैं कि उत्तर कोड को सरल बनाता है।

ध्यान दें कि आपके मूल कोड में लगता है आपके पास एक बग था। यह पाया गया कि सूचकांक i पर ग्राहक सही आईडी था, फिर आपने ग्राहक को id पर वापस कर दिया - मुझे संदेह है कि यह वास्तव में आपके इरादे से है।

दूसरा, यदि आप आईडी द्वारा बहुत सारे लुकअप करने जा रहे हैं, तो क्या आपने अपने ग्राहकों को Map<Integer, Customer> में डालने पर विचार किया है?

16

व्यक्तिगत रूप से मैं शायद ही कभी अपने आप छोरों बारे में अब जब मैं इसके साथ प्राप्त कर सकते हैं ... मैं जकार्ता कॉमन्स libs का उपयोग करें:

Customer findCustomerByid(final int id){ 
    return (Customer) CollectionUtils.find(customers, new Predicate() { 
     public boolean evaluate(Object arg0) { 
      return ((Customer) arg0).getId()==id; 
     } 
    }); 
} 

आहा! मैंने एक लाइन बचाई!

+1

जब भी आप कोई खोज() फ़ंक्शन लिखते हैं, तो आपने एक पंक्ति सहेजी है :-) इसे छींकना नहीं है! –

+0

जब भी आप इसे लिखते हैं, तो आप कोड की एक पंक्ति को "सहेजा" सकते हैं, लेकिन यदि आप देखते हैं कि फ़ंक्शन कैसे काम करता है तो आप देखेंगे कि आप लूप के लिए उपयोग कर रहे हैं। तो किसी को खुद से पूछना चाहिए कि क्या आप वास्तव में किसी भी लाइन को "सेव" करते हैं या अंडरलाइनिंग कोड में और लाइनें जोड़ते हैं? ;) – Spider

+2

@ स्पाइडर रनटाइम निष्पादन कोड को मापने का एक ही तरीका है ... कम बार-बार कोड रखने के अन्य लाभ हैं। –

2

भले ही वह विषय काफी पुराना हो, मैं कुछ जोड़ना चाहता हूं। क्या आप कक्षाओं के लिए equals के ऊपर लिख, तो यह आपके getId तुलना हैं, तो आप उपयोग कर सकते हैं:

customer = new Customer(id); 
customers.get(customers.indexOf(customer)); 
बेशक

, तो आप एक IndexOutOfBounds -Exception के लिए जाँच करने के लिए एक नल पॉइंटर में जो अनुवाद किया जा oculd होगा या एक कस्टम CustomerNotFoundException

0

मैंने उसके करीब कुछ किया, संकलक देख रहा है कि आपका रिटर्न स्टेटमेंट एक if() कथन में है। यदि आप इस त्रुटि को हल करना चाहते हैं, तो बस कथन से पहले ग्राहक आईडी नामक एक नया स्थानीय चर बनाएँ, फिर if स्टेटमेंट के अंदर एक मान असाइन करें। यदि कथन के बाद, अपना रिटर्न स्टेटमेंट कॉल करें, और cstomerId वापस करें। इस तरह:

Customer findCustomerByid(int id){ 
boolean exist=false; 

if(this.customers.isEmpty()) { 
    return null; 
} 

for(int i=0;i<this.customers.size();i++) { 
    if(this.customers.get(i).getId() == id) { 
     exist=true; 
     break; 
    } 

    int customerId; 

    if(exist) { 
     customerId = this.customers.get(id); 
    } else { 
     customerId = this.customers.get(id); 
    } 
} 

ग्राहक वापसी आईडी;

}

1

जावा 8 में:

Customer findCustomerByid(int id) { 
    return this.customers.stream() 
     .filter(customer -> customer.getId().equals(id)) 
     .findFirst().get(); 
} 

यह भी बेहतर हो सकता है Optional<Customer> में लौटने प्रकार बदलने के लिए।