2015-05-15 5 views
7

मैं पढ़ने वाली फ़ाइल से Customer की एक सूची उत्पन्न करता हूं। मैं डेटा है कि मैं HashMap में वस्तु को अद्यतन करने के लिए उपयोग मिलता है एक दूसरे फ़ाइल सेसंग्रह में एक ऑब्जेक्ट खोजें, हैश मैप बनाम सूची फ़िल्टर

Map<String, Customer> customers = readCustomers(); //For each object created customers.put(c.getCustomerId(), c);

: मैं एक HashMap जहां कुंजी में एक विशिष्ट आईडी है में इन ग्राहकों की दुकान। मैं अद्यतन करने के लिए वस्तु को खोजने के क्रम में कुंजी का उपयोग करें:

//get the details informations customers.get(customerId).setDetails(details);

जावा 8 में मैं इस्तेमाल कर सकते हैं:

class Customer{ 
    ... 

    public static Customer find(List<Customer> customers, int id) { 
     return customers.stream().filter(c -> c.customerId == id).findAny().get(); 
    } 
} 

//usage 
List<Customer> customers = readCustomers();  
... 
Customer.find(customers, 21).setDetails(details); 

वहाँ जावा 8 विधि का उपयोग कर एक प्रदर्शन में सुधार हो सकता है? इन तरीकों के बीच सबसे अच्छा अभ्यास क्या है?

उत्तर

12

हैश मैप में कुंजी द्वारा मूल्य के लिए खोज करना ओ (1) अपेक्षित समय लेता है, जो ओ (एन) से तेज़ है जो सूची में समान मूल्य की खोज करेगा।

जावा 8 स्ट्रीम का उपयोग करना उसमें बदलाव नहीं करता है, क्योंकि फैंसी न्यू सिंटैक्स के दृश्यों के पीछे, यह अभी भी एक मैच खोजने तक सूची के तत्वों पर पुनरावृत्त करता है।

+0

जिज्ञासा से बाहर, क्या आप जानते हैं कि फैंसी न्यू सिंटैक्स जेवीएम को किसी भी "चालाक" तरीके से खोज करने के लिए पर्याप्त बुद्धिमान होने का कारण बनता है या फिर भी यह वही लूपिंग होगा जैसा कि यह था पाश? – david99world

+1

@ डेविड यदि आप समानांतर धारा का उपयोग करते हैं, तो खोज को कई धागे पर समवर्ती रूप से निष्पादित किया जा सकता है, लेकिन यह अभी भी हैश मैप को हरा नहीं देता है। – Eran

+2

"ओ (1) अपेक्षित समय लेता है" कोई समझ नहीं आता है क्योंकि ओ (1) समय की इकाई नहीं है, जबकि "ओ (एन) से तेज है" बस * गलत * है। सही कथन यह है कि ओ (1) * के समय की जटिलता * (एन) से "एन * के बड़े मूल्यों" के लिए बेहतर होती है। हालांकि, निष्कर्ष है कि एक रैखिक खोज करने के लिए स्ट्रीम एपीआई का उपयोग करना कोई सुधार अभी भी सही नहीं है। न केवल इसलिए कि यह बड़े * एन * एस के लिए अच्छी तरह से स्केल नहीं करेगा बल्कि यह भी क्योंकि '.get (customerId) '' .stream() से अधिक पठनीय है। फ़िल्टर (सी -> c.customerId == आईडी) .findAny() .Get() '। – Holger

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