दिलचस्प पोस्ट
Matplotlib में इनलाइन लेबल PHP मेल किसी कारण से काम नहीं कर रहा है क्या जेपीए इकाई प्रबंधक बंद होना चाहिए? नक्शा का उपयोग करते समय प्रतिक्रिया 'अपरिभाषित की संपत्ति नहीं पढ़ सकता' अमेज़ॅन क्लाउड सर्वर पर FTP सेट करना मुझे यह त्रुटि मिलती है: डेटा एंड्रॉइड 2.2 पर UNCOMPRESS_DATA_MAX से अधिक है, लेकिन 2.3 पर नहीं क्यों सी # संदर्भों की वापसी का समर्थन नहीं करता है? पासवर्ड सत्यापन के लिए नियमित अभिव्यक्ति मैं MATLAB में एक बदल वाली छवि कैसे बचा सकता हूँ? फायरबसे पुश नोटिफिकेशन डीबी गतिशील रूप से आवंटित सरणी के लिए आदर्श विकास दर क्या है? इनलाइन ब्लॉक सूची आइटम के बीच एक स्थान फ़ायरफ़ॉक्स, सफारी और क्रोम के साथ क्लिपबोर्ड पर टेक्स्ट कॉपी / रखें जावा पूर्णांक तुलना करें () – क्यों तुलना बनाम घटाव का उपयोग करें? रूबी के साथ मौजूदा पीडीएफ को संपादित या लिखने के लिए कैसे?

जावा में एक पाठ फ़ाइल की यादृच्छिक रेखा कैसे प्राप्त करें?

कहें कि एक फाइल बहुत बड़ी है जिसे स्मृति में रखा जाना है मैं इसे से एक यादृच्छिक रेखा कैसे प्राप्त कर सकता हूं? धन्यवाद।

अद्यतन: मैं प्रत्येक पंक्ति को बराबर होने की संभावनाएं चाहता हूं

Solutions Collecting From Web of "जावा में एक पाठ फ़ाइल की यादृच्छिक रेखा कैसे प्राप्त करें?"

यहाँ एक समाधान है चयन () पद्धति पर एक नज़र डालें जो वास्तविक वस्तु (मुख्य विधि) बार-बार अभ्यास का चयन करती है (), यह दिखाने के लिए कि वितरण वास्तव में एक समान है)।

यह विचार सरल है: जब आप पहली पंक्ति को पढ़ते हैं तो उसका परिणाम के रूप में चुना जाने का 100% मौका होता है। जब आप दूसरी पंक्ति पढ़ते हैं तो परिणाम के रूप में पहली पंक्ति को बदलने का 50% मौका होता है। जब आप तीसरे पंक्ति को पढ़ते हैं, तो परिणाम बनने का 33% मौका होता है। चौथी पंक्ति में 25% है, और इसी तरह ….

import java.io.*; import java.util.*; public class B { public static void main(String[] args) throws FileNotFoundException { Map<String,Integer> map = new HashMap<String,Integer>(); for(int i = 0; i < 1000; ++i) { String s = choose(new File("g:/temp/a.txt")); if(!map.containsKey(s)) map.put(s, 0); map.put(s, map.get(s) + 1); } System.out.println(map); } public static String choose(File f) throws FileNotFoundException { String result = null; Random rand = new Random(); int n = 0; for(Scanner sc = new Scanner(f); sc.hasNext(); ) { ++n; String line = sc.nextLine(); if(rand.nextInt(n) == 0) result = line; } return result; } } 

यदि आप चाहें तो पूरी फाइल पढ़ना एक पंक्ति बहुत अधिक लगता है। निम्नलिखित अधिक कुशल होना चाहिए:

  1. फ़ाइल में यादृच्छिक बाइट स्थिति की तलाश करने के लिए RandomAccessFile का उपयोग करें।
  2. अगले लाइन टर्मिनेटर को बाएं और दाएं ढूँढ़ें एल को उन दोनों के बीच की रेखा दें।
  3. संभावना के साथ (MIN_LINE_LENGTH / L.length) लौटें एल। अन्यथा, चरण 1 पर शुरू करें

यह अस्वीकृति नमूनाकरण का एक प्रकार है

रेखा की लंबाई में लाइन टर्मिनेटर वर्ण (एस) शामिल हैं, इसलिए MIN_LINE_LENGTH> = 1. (सभी बेहतर अगर आप लाइन लंबाई पर एक कड़ी बाध्य जानते हैं)।

यह ध्यान देने योग्य है कि इस एल्गोरिथम का रनटाइम फ़ाइल आकार पर निर्भर नहीं है, केवल रेखा की लंबाई पर, अर्थात यह पूरी फ़ाइल को पढ़ने से बेहतर है।

या तो तुम

  1. फ़ाइल दो बार पढ़ें – एक बार लाइनों की संख्या, एक यादृच्छिक रेखा को निकालने के लिए दूसरी बार, या

  2. जलाशय नमूनाकरण का उपयोग करें

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

 import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; public class reservoirSampling { public static void main(String[] args) throws FileNotFoundException, IOException{ Sampler mySampler = new Sampler(); List<String> myList = mySampler.sampler(10); for(int index = 0;index<myList.size();index++){ System.out.println(myList.get(index)); } } } import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Scanner; public class Sampler { public Sampler(){} public List<String> sampler (int reservoirSize) throws FileNotFoundException, IOException { String currentLine=null; //reservoirList is where our selected lines stored List <String> reservoirList= new ArrayList<String>(reservoirSize); // we will use this counter to count the current line number while iterating int count=0; Random ra = new Random(); int randomNumber = 0; Scanner sc = new Scanner(new File("Open_source.html")).useDelimiter("\n"); while (sc.hasNext()) { currentLine = sc.next(); count ++; if (count<=reservoirSize) { reservoirList.add(currentLine); } else if ((randomNumber = (int) ra.nextInt(count))<reservoirSize) { reservoirList.set(randomNumber, currentLine); } } return reservoirList; } } 

मूल आधार यह है कि आप जलाशय को भरें, और फिर उस पर वापस जाएं और यादृच्छिक लाइनों को 1 / रिज़र्वर्स साइज़ मौके के साथ भरें। मुझे उम्मीद है कि यह अधिक कुशल कोड प्रदान करता है कृपया मुझे बताएं कि यह आपके लिए काम नहीं करता है, क्योंकि मैंने सचमुच आधे घंटे में इसे खटखटाया है।

एक BufferedReader का उपयोग करें और पंक्ति के अनुसार पढ़ें। यादृच्छिक रूप से बंद करने के लिए java.util.Random ऑब्जेक्ट का उपयोग करें;)