سؤال

أحاول قراءة ملف جافا وتعديله في وقت واحد.هذا ما يجب أن أفعله:الملف الخاص بي هو بالتنسيق:

aaa
bbb
aaa
ccc
ddd
ddd

أحتاج إلى قراءة الملف والحصول على عدد التكرارات وتعديل التكرارات للحصول على الملف التالي:

aaa -  2
bbb -  1
ccc -  1
ddd -  2

حاولت استخدام RandomAccessFile للقيام بذلك، ولكن لم أستطع القيام بذلك.هل يمكن لأحد أن يساعدني في الحصول على رمز لهذا؟

هل كانت مفيدة؟

المحلول

من الأسهل بكثير إذا لم تفعل شيئين في نفس الوقت. أفضل طريقة هي الركض عبر الملف بأكمله ، وحساب جميع حوادث كل سلسلة في تجزئة ثم اكتب جميع النتائج في ملف آخر. ثم إذا كنت بحاجة إلى ذلك ، فانتقل الملف الجديد عبر الملف القديم.

لا ترغب أبدًا في القراءة والكتابة إلى نفس الملف في نفس الوقت. ستتغير تعويضاتك داخل الملف في كل مرة تقوم فيها بكتابة ولن يتتبع مؤشر القراءة ذلك.

نصائح أخرى

سأفعل ذلك بهذه الطريقة:- تحليل الملف الأصلي وحفظ جميع الإدخالات في ملف جديد.استخدم كتل البيانات ذات الطول الثابت لكتابة إدخالات إلى الملف الجديد (لذلك، لنفترض أن أطول سلسلة لديك يبلغ طولها 10 بايت، خذ 10 + x كطول للكتل، x هو للمعلومات الإضافية التي تريد حفظها على طول الإدخالات.وبالتالي فإن الإدخال العاشر في الملف سيكون في موضع البايت 10*(10+x)).يجب عليك أيضًا معرفة عدد الإدخالات لإنشاء (بحيث يكون حجم الملف noOfEntries*blocklength، استخدم RandomAccesFile وsetLength لتعيين طول الملف هذا).- استخدم الآن خوارزمية الفرز السريع لفرز الإدخالات في الملف (فكرتي هي الحصول على ملف مفروز في النهاية مما يجعل الأمور أسهل بكثير وأسرع في النهاية.قد تعمل التجزئة من الناحية النظرية أيضًا، ولكن سيتعين عليك التعامل مع إعادة ترتيب الإدخالات المكررة ثم تجميع كل التكرارات - وليس هذا خيارًا حقًا هنا).- تحليل الملف مع الإدخالات التي تم فرزها الآن.حفظ مؤشر لإدخال أول تواجد للإدخال.قم بزيادة عدد التكرارات حتى يكون هناك إدخال جديد.قم بتغيير الإدخال الأول وأضف تلك المعلومات الإضافية التي تريد الحصول عليها هناك في ملف "النتيجة النهائية" الجديد.استمر بهذه الطريقة مع كافة الإدخالات المتبقية في الملف الذي تم فرزه.

الاستنتاجات:أعتقد أن هذا يجب أن يكون سريعًا إلى حد معقول وأن يستخدم قدرًا معقولاً من الموارد.ومع ذلك، ذلك يعتمد على البيانات التي لديك.إذا كان لديك عدد كبير جدًا من التكرارات، فسوف يتراجع أداء الفرز السريع.وأيضًا، إذا كانت أطول عملية إدخال للبيانات أطول بكثير من المتوسط، فسوف يؤدي ذلك أيضًا إلى إهدار مساحة الملف.

إذا كان عليك ذلك ، فهناك طرق يمكنك معالجة نفس الملف وتحديث العدادات ، دون الحاجة إلى فتح ملف آخر أو الاحتفاظ بكل شيء في الذاكرة. ومع ذلك ، فإن أبسط الأساليب سيكون بطيئًا جدًا.

 import java.util.*;
 import java.io.*;
 import java.util.*;
 class WordFrequencyCountTest
 {
 public static void main( String args[])
 {
System.out.println(" enter the file name");
Scanner sc = new Scanner(System.in);
String fname= sc.next();    
     File f1 = new File(fname);


    if(!f1.exists())
    {
        System.out.println(" Source file doesnot exists");
        System.exit(0);
    }
    else{
        try{                
            FileReader fis = new FileReader(f1);
            BufferedReader br = new BufferedReader(fis);
            String str = "";
            int count=0;  
        Map<String, Integer> map = new TreeMap<String, Integer>(); 
            while((str = br.readLine()) != null )
            {
                String[] strArray = str.split("\\s");
                count=1;
                for(String token : strArray)   // iteration of strArray []
                {                       
                if(map.get(token)!=null )
            {
                        count=map.get(token);
                        count++;
                        map.put(token, count);
                        count=1;
                    }else{
                        map.put(token, count);

                    }
                }
            }

            Set set=map.entrySet();
            Iterator itr = set.iterator();    
            System.out.println("========");

            while(itr.hasNext())
            {
                Map.Entry entry = (Map.Entry)itr.next();

                System.out.println( entry.getKey()+ " "+entry.getValue());
            }               
            fis.close();            
        }catch(Exception e){}
           }
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top