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());
}
}
}