How to write a single thread in java that reads comments in text file?

Viewed 35

I need some help, i have a java program that analyze number of comments within a text file.The number of these text files are 3 at the moment. Yet the program must be able to print them separately as per file. I am now struggling how to process them concurrently as per thread file. Below is my source code.

// CommentAnalyse.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class CommentAnalyzer {
    
    private File file;
    
    public CommentAnalyzer(File file) {
        this.file = file;
    }
    
    public Map<String, Integer> analyze() {
        
        Map<String, Integer> resultsMap = new HashMap<>();
        
        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
            
            String line = null;
            while ((line = reader.readLine()) != null) {
                
                if (line.length() < 15) {
                    
                    incOccurrence(resultsMap, "SHORTER_THAN_15");

                } else if (line.contains("Mover")) {

                    incOccurrence(resultsMap, "MOVER_MENTIONS");
                
                } else if (line.contains("Shaker")) {

                    incOccurrence(resultsMap, "SHAKER_MENTIONS");
                
                }
            }
            
        } catch (FileNotFoundException e) {
            System.out.println("File not found: " + file.getAbsolutePath());
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("IO Error processing file: " + file.getAbsolutePath());
            e.printStackTrace();
        }
        
        return resultsMap;
        
    }
    
    /**
     * This method increments a counter by 1 for a match type on the countMap. Uninitialized keys will be set to 1
     * @param countMap the map that keeps track of counts
     * @param key the key for the value to increment
     */
    private void incOccurrence(Map<String, Integer> countMap, String key) {
        
        countMap.putIfAbsent(key, 0);
        countMap.put(key, countMap.get(key) + 1);
    }

}


// Main. java
import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        
        Map<String, Integer> totalResults = new HashMap<>();
                
        File docPath = new File("docs");
        File[] commentFiles = docPath.listFiles((d, n) -> n.BeginWith(".txt"));
        
        for (File commentFile : commentFiles) {
            
            CommentAnalyzer commentAnalyzer = new CommentAnalyzer(commentFile);
            Map<String, Integer> fileResults = commentAnalyzer.analyze();
            addReportResults(<fileResults>, <totalResults>);
                        
        }
        
        System.out.println("RESULTS\n=======");
        totalResults.forEach((d,n) -> System.out.println(d + " : " + n));
    }
    
    /**
     * This method adds the result counts from a source map to the target map 
     * @param source the source map
     * @param target the target map
     */
    private static void addReportResults(Map<String, Integer> source, Map<String, Integer> target) {

        for (Map.Entry<String, Integer> entry : source.entrySet()) {
            target.put(entry.getKey(), entry.getValue());
        }
        
    }

}
0 Answers
Related