2011-01-24 14 views
8

मैं एक एंड्रॉइड ऐप प्रोग्राम कर रहा हूं, और अपने प्रोग्राम को एक फ़ाइल की यादृच्छिक रेखा पढ़ने के लिए चाहूंगा। मुझसे यह कैसे होगा?जावा - रैंडम लाइन

उत्तर

4

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

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

यदि रेखाएं लगभग समान लंबाई होती हैं और आपको सही "यादृच्छिकता" की आवश्यकता नहीं होती है, तो आप फ़ाइल के अंदर एक यादृच्छिक बाइट ऑफसेट भी चुन सकते हैं और निकटतम लाइन ब्रेक के लिए स्कैन कर सकते हैं।

+0

यह वास्तव में मेरी योजना थी। क्या आप मुझे और जानकारी दे सकते हैं कि लाइनों को निश्चित लंबाई क्यों तय की जानी चाहिए? मेरे पास सिर्फ एक 'होगा।txt' फ़ाइल (या .bin जो भी हो)। – Wallter

+0

@ वाल्टर: यदि रेखाओं में एन बाइट्स की निश्चित लंबाई है (एन्कोडिंग समस्याएं सावधान रहें!) और फ़ाइल आकार एस है, तो एस/एन लाइनें हैं और लाइन नंबर एक्स बाइट ऑफसेट एक्स * एन पर शुरू होता है। एक फ़ाइल में दिए गए बाइट ऑफ़सेट पर कूदना आसान और कुशल दोनों है। –

+0

@ माइकल: यह समझ में आता है - हालांकि यह इसके लायक से अधिक काम की तरह लगता है, अगर आपके पास केवल एक समारोह था जो दीक्षा में भाग गया था (या फ़ाइल में पहली पंक्ति में लाइनों की संख्या है) – Wallter

8

आप जो चाहते हैं वह LineNumberReader है।

आप फ़ाइल में यादृच्छिक स्थिति में जाने के लिए विधि setLineNumber() का उपयोग कर सकते हैं।

LineNumberReader rdr; 
int numLines; 
Random r = new Random(); 
rdr.setLineNumber(r.nextInt(numLines)); 
String theLine = rdr.readLine(); 
+1

+1 याद। यह देने के बारे में एक बेहतर जवाब है। मुझे नहीं पता था कि कक्षा मौजूद थी। – McStretch

+0

@McStretch, धन्यवाद। इस तरह के ऑपरेशन के लिए कक्षा बहुत उपयोगी है। (लेकिन आमतौर पर उपयोग करने के लिए बेहतर कक्षाएं होती हैं) – jjnguy

+0

यह निश्चित रूप से काम करता है लेकिन आपको वास्तव में यह ध्यान रखना होगा कि प्रत्येक पंक्ति पढ़ने का मतलब फ़ाइल की शुरुआत और उस पंक्ति के बीच सभी पंक्तियों को पढ़ना है। –

1

एक यादृच्छिक संख्या प्राप्त करने के लिए आप उपयोग पैकेज से जावा की Random कक्षा का उपयोग कर सकते हैं।

Random rnd = new Random(); 
int nextRandomLineNumber = rnd.nextInt(); 

http://developer.android.com/reference/java/util/Random.html

+0

एकमात्र समस्या जो मैं देखता हूं इसके साथ है: 'रैंडम() ' – Wallter

+0

के लिए कोई सीमा निर्धारित नहीं है आप अन्य अगली INT() विधि, nextInt (int n) का उपयोग करके सीमा निर्धारित करेंगे:" एक छद्म यादृच्छिकता देता है, समान रूप से वितरित int मान 0 के बीच (समावेशी) और निर्दिष्ट मूल्य (अनन्य), इस यादृच्छिक संख्या जनरेटर के अनुक्रम से खींचा गया। " – McStretch

+0

हाँ, मैं बस उसे उस वर्ग को दिखाना चाहता था, जिसके बाद अगला (int x) वह 0 और x के बीच एक int प्राप्त करेगा। जब मैंने अपनी पोस्ट समाप्त की, तो पहला जवाब पहले से ही सही किया गया था (पहले केवल थ्री यादृच्छिक वस्तु के बिना setLineNumber के बारे में टिप्पणी थी) – Lars

2

एक पुराने जमाने जवाब देखें: तुम वापस एक अशक्त मिलता है, बस विधि

BufferedReader br = new BufferedReader(file); 
Random rng = new Random (8732467834324L); 
String s = br.readLine(); 
for (; s != null ; s = br.readLine()) 
    if (rng.nextDouble() < 0.2) 
     break; 
br.close(); 
return s; 
संबंधित मुद्दे