मेरे पास शब्दों का एक हैश मैप है जिसमें शब्द किस पृष्ठ पर दिखाई देता है, पृष्ठ में शब्द की आवृत्ति, और उनकी स्थिति का डेटा होता है।

उदाहरण: शब्द - [पृष्ठ संख्या, पृष्ठ में शब्द आवृत्ति, पृष्ठ में स्थिति]

cat [1, 3, 1, 2, 5 ], [2, 2, 2, 5 ]
dog [2, 2, 1, 7 ]

मैं इस जानकारी को एक बाइनरी फ़ाइल में कैसे संग्रहीत करूं जो वापस पढ़ने में आसान हो?

मैंने निम्नलिखित प्रयास किया:

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream out = new DataOutputStream(baos);

        for(String word: invertedIndex.keySet()) {
            out.writeUTF(word);  // Write the word
            for(Entry entry: invertedIndex.get(word)) {  // Info for a page
                out.writeInt(entry.pageNum); // Write its page number
                out.writeInt(entry.wordFrequency); // Write its freq in that page

                for(int position: entry.positions) {
                    out.writeInt(position); // Write the positions
                }
            }
        }

        byte[] bytes = baos.toByteArray();

        FileOutputStream fos = new FileOutputStream(PATH);
        fos.write(bytes);
        fos.close();

सुनिश्चित नहीं है कि यह सही है... अग्रिम धन्यवाद।

संपादित करें: धन्यवाद, मेरी समस्या यह है कि इसे सख्ती से एन्कोड करने के बजाय इसे डीकोड करने के तरीके पर अधिक है।

0
user4500400 2 अक्टूबर 2017, 04:02
2
क्यों न केवल Map को क्रमबद्ध करें, अर्थात ObjectOutputStream का उपयोग करें?
 – 
Andreas
2 अक्टूबर 2017, 04:05
1
यह एक असाइनमेंट के लिए है और कहा गया था "डिस्क पर केवल क्रमबद्ध जावा ऑब्जेक्ट्स न लिखें"। क्या इस डेटा संरचना को बाइनरी में संरक्षित करने का कोई तरीका है?
 – 
user4500400
2 अक्टूबर 2017, 04:19
1
"क्या इस डेटा संरचना को संरक्षित करने का कोई तरीका है?" हाँ ... आप कोड लिखते हैं। आपने कोड लिखा है। आपका वास्तविक प्रश्न क्या है?
 – 
Stephen C
2 अक्टूबर 2017, 04:20
हो सकता है कि compress करने के लिए आपका शिक्षक आपको ढूंढ रहा हो क्रमबद्ध करने से पहले ?
 – 
jmj
2 अक्टूबर 2017, 04:28
- मैं इस डेटा को एक बाइनरी फ़ाइल में कैसे लिखूं जो मुझे डेटा को आसानी से वापस पढ़ने की अनुमति देगा? जैसे [बिल्ली 1 3 1 2 5 2 2 2 5 कुत्ता 2 2 1 7]। मैं इसे एक बाइनरी फ़ाइल में कैसे संग्रहीत करूं जहां मैं इसे पढ़ता हूं और जानता हूं कि कुछ बाइट्स (?) एक स्ट्रिंग है?
 – 
user4500400
2 अक्टूबर 2017, 04:30

1 उत्तर

सबसे बढ़िया उत्तर

क्या इस डेटा संरचना को संरक्षित करने का कोई तरीका है?

हाँ। बहुत सारे तरीके।

संकेत: आपका प्रयास किया गया समाधान एक अच्छी शुरुआत है।

हालांकि एक पूर्ण समाधान के लिए डेटा को वापस पढ़ने के लिए संबंधित विधि की आवश्यकता होती है। और जब आप एक पठन विधि लिखने का प्रयास करते हैं जो आपके लेखन कोड से मेल खाती है, तो आप पाएंगे कि एक प्रणालीगत समस्या है। उदाहरण के लिए, यह पता लगाने का कोई आसान तरीका नहीं है कि int मानों की एक सूची कहां समाप्त होती है और अगली कहां से शुरू होती है।

इसे हल करने के तरीके हैं। इसके बारे में सोचें। आप एक के बाद एक दो सूचियाँ कैसे लिख सकते हैं ताकि आप जान सकें कि एक कहाँ समाप्त होती है और दूसरी कहाँ शुरू होती है?

नोट: ByteArrayOutputStream का आपका उपयोग अनावश्यक है। आप एक BufferedOutputStream में लिपटे FileOutputStream को सीधे लिख सकते हैं।

2
Stephen C 2 अक्टूबर 2017, 04:34
अधिक सटीक: वह बता सकता है कि वर्तमान सूची कहाँ समाप्त होती है, लेकिन फिर वह यह नहीं बता सकता कि कोई दूसरा अनुसरण करता है, या अगला कार्यकाल।
 – 
erickson
2 अक्टूबर 2017, 04:42
एक से अधिक पृष्ठों पर प्रदर्शित होने वाले शब्द के मामले पर विचार करें।
 – 
Stephen C
2 अक्टूबर 2017, 04:43
सूची समाप्त होती है जब एक स्ट्रिंग होती है और वह तब होता है जब अगली प्रविष्टि शुरू होती है। लेकिन मैं इस बात से बहुत परिचित नहीं हूं कि यह बाइनरी में कैसे संग्रहीत होता है। जैसे मैं बाइनरी के लिए एक शब्द लिखता हूं: out.writeUTF(word); और अन्य चीजें जैसे out.writeInt(entry.pageNum); out.writeInt(entry.wordFrequency);. क्या यह इस तरह से संग्रहीत है: स्ट्रिंग int int स्ट्रिंग int int int। तो जब मैं पहली बार बाइनरी पढ़ता हूं तो मुझे पता है कि ये बाइट स्ट्रिंग हैं और ये बाइट int हैं?
 – 
user4500400
2 अक्टूबर 2017, 04:43
मैं चाहता हूं कि आप इनट्स की 2 सूचियां लिखने के तरीके के बारे में सोचें। एक बार जब आप इसका पता लगा लेते हैं, तो आप यहां समाधान को सामान्य/लागू कर सकते हैं।
 – 
Stephen C
2 अक्टूबर 2017, 04:46
1
चूँकि आप पहले से जानते हैं कि सूची में कितनी प्रविष्टियाँ हैं, गिनती लिखकर शुरू करें। तब पाठक उस गिनती को पढ़ सकता है, और उसे पता चल जाएगा कि कितने मान अनुसरण करते हैं।
 – 
Andreas
2 अक्टूबर 2017, 05:13