2013-06-07 4 views
5

मैं जावा के लिए नया हूँ, इसलिए मुझे यकीन है कि जो डेटा संरचना की पसंद यहाँ अच्छा होगा नहीं हूँ। मैं एक सूची में एक्सेलेरोमीटर, जीरोस्कोप और मैग्नेटोमीटर डेटा (9 मान) स्टोर करूंगा, जिसे बाद में चिकनाई, प्रदर्शन और कुछ सिग्नल प्रोसेसिंग के लिए इस्तेमाल किया जाएगा। , समय स्टाम्प और नौ रुझान/प्रस्ताव मान उन सभी को तैरता:जावा में समय श्रृंखला डेटा के लिए कौन सी डेटा संरचना समझदार है?

मेरा विचार एक वस्तु MyObject दस सदस्य हैं बनाने के लिए है। मैं फिर डेटा को ArrayList<MyObject> में संग्रहीत करूंगा। क्या यह एक अच्छा विचार है या मैंने कुछ अनदेखा किया है?

सूची में सबसे 100k मूल्यों का आयोजन करेगा।

+0

समवर्ती पहुँच की संभावना है? – fge

+0

@fge नहीं है, सब कुछ एकल थ्रेड में चलेंगे। – Andreas

+0

तो फिर एक ArrayList ठीक है।लेकिन 100k मान काफी बड़े हैं, क्या आप इसे प्रसंस्करण से पहले लगातार भंडारण में लिखते हैं या आप चलते समय उन्हें संसाधित करते हैं? – fge

उत्तर

1

एक शुरुआत के लिए ट्री-मैप का उपयोग करें देखने के प्रदर्शन में सुधार करने के लिए।

TreeMap

(डॉक्स में) नोट:

यह कार्यान्वयन, containsKey के लिए गारंटी लॉग (एन) समय लागत प्रदान करता है, पाने के रख दिया और संचालन को हटा दें।

+5

यदि डेटा श्रृंखला क्रम में संग्रहीत की जाती है, तो 'ArrayList' तेज है ... – fge

+0

@fge n = 100k के लिए, n बनाम लॉग (एन), लॉग (एन) = 5 और एन = 100 000. अगर मैं खोज रहा था किसी विशेष आइटम के लिए और आखिरी वस्तु होने के लिए मुझे अंतिम आइटम से मिलान करने के लिए 100 000 आइटमों के माध्यम से खोजना होगा। हो सकता है कि गुणों का एक हैशमैप 1 चरण सरणी अनुक्रमणिका पहुंच प्रदान करने के लिए ArrayList में एक अनुक्रमणिका बना सकता है। यह भी सुनिश्चित नहीं है कि अगर आप जिस आइटम को ढूंढ रहे हैं उस इंडेक्स को नहीं जानते हैं तो एक सॉर्टेड सरणीसूची तेजी से पहुंच कैसे प्रदान कर सकती है? – Excalibur2000

+0

टिप्पणियां पढ़ें: उसे अपने प्रोग्राम में डेटा_ तक पहुंचने की ज़रूरत नहीं है, केवल इसे स्टोर करें, प्रसंस्करण बाद में किया जाता है। इस तरह उन्हें "केवल तेजी से सम्मिलन" डेटा संरचना की आवश्यकता होती है। इसके लिए 'ट्रीमैप' ओवरकिल है। – fge

0

अपनी खुद की कक्षा बनाना सही तरीका है। अब उस वर्ग की वस्तुओं को संग्रहीत करने के लिए ...

यदि आपको ऑब्जेक्ट पर सीधे लुकअप की आवश्यकता है (उदाहरण के लिए, "मुझे 5 वें ऑब्जेक्ट दें") ऑब्जेक्ट्स पर एक बार, ArrayList का उपयोग करें। लेकिन अगर आप ऑब्जेक्ट्स में सभी ऑब्जेक्ट्स पर लूपिंग करेंगे, तो आपको linked list का उपयोग करने पर विचार करना चाहिए।

ArrayList वर्ग एक आदिम सरणी के रूप में तत्वों आप इसे करने के जोड़ रहे हैं समायोजित करने के लिए है कि यह बड़ा हो जाएगा उपयोग करता है। जब यह अपनी आंतरिक संरचना को बढ़ाता है, तो उसे एक नई सरणी आवंटित करने और सभी मूल मूल्यों की प्रतिलिपि बनाने की आवश्यकता होती है। यह महंगा हो सकता है (विशेष रूप से 100 के तत्वों के साथ!)। आप यह इससे पहले कि यह बढ़ने की जरूरत है इसे और अधिक समय देने के लिए एक प्रारंभिक आकार दे सकते हैं, लेकिन अगर आपको इतनी जगह की आवश्यकता नहीं होती है, तो ऐरेलिस्ट की आंतरिक सरणी स्मृति का एक बड़ा हिस्सा बर्बाद कर सकती है।

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

0

आप सीधे अपने डेटा उत्पादन के लिए एक फ़ाइल उत्पादन धारा का उपयोग कर, बल्कि कुछ डेटा संरचना में भंडारण से विचार करना चाह सकते:

output = new BufferedWriter(new FileWriter("output.csv")); 

while(dataSource.stillHasData()) 
    output.println(dataSource.getData().toString()); 

output.close(); 

का उपयोग करते हुए एक BufferedWriter सुनिश्चित करता है कि कार्यक्रम के लिए प्रतीक्षा करने की जरूरत नहीं है डिस्क से पहले ही अगले डेटा ले जा सकते हैं तो होना ही लिखते हैं, तो यह लाइव डेटा (आमतौर पर) इकट्ठा करने के लिए स्वीकार्य होगा।

तब आप अपने डेटा कक्षा में कुछ इस तरह करना चाहिए:

public String toString(){ 
    StringBuilder buf = new StringBuilder(); 

    buf.append(timeStamp); str.append(','); 
    // ... 
    // append all the other data 

    return buf.toString(); 
} 

करने का इस तरह से यह लाभ यह है कि आप तो एक्सेल जैसे कार्यक्रमों में आयात कर सकते हैं या वास्तव में सिर्फ किसी भी प्रोग्राम है कि आप प्रयोग करेंगे के बारे में है डेटा को संसाधित करने के लिए।

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