patternjavaModerate
Counting characters in a text file
Viewed 0 times
characterstextfilecounting
Problem
I have a text file and I was curious about what character appears how often in the text.
Any review is appreciated.
The output will be for example:
Any review is appreciated.
public class CountLetters {
public static void main(String[] args) throws Exception {
TreeMap hashMap = new TreeMap();
File file = new File("C:/text.txt");
Scanner scanner = new Scanner(file,"utf-8");
while (scanner.hasNext()) {
char[] chars = scanner.nextLine().toLowerCase().toCharArray();
for (Character c : chars) {
if(!Character.isLetter(c)){
continue;
}
else if (hashMap.containsKey(c)) {
hashMap.put(c, hashMap.get(c) + 1);
} else {
hashMap.put(c, 1);
}
}
}
for (Map.Entry entry : hashMap.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}The output will be for example:
a: 1202
b: 311
c: 603
d: 510
e: 2125
f: 373
g: 362
h: 718
i: 1313
j: 5
k: 74
l: 678
m: 332
n: 1129
o: 1173
p: 348
q: 40
r: 812
s: 1304
t: 1893
u: 415
v: 195
w: 314
x: 86
y: 209
z: 9Solution
Resources:
You should start using
You also shouldn't throw
Conditionals:
This is an early return statement for the purpose of following conditions, meaning you don't have to write
Naming
You might want to rename it to
all else equal, your naming is nice and consistent, and tells exactly what the variables do. You nicely follow
Summary:
Your code reads nicely and is easily understandable. You follow naming conventions and have descriptive and understandable variable names. You should work on your exception handling and the use of resources.
You should start using
try-with-resources. This statment does some work for you with resources that implement AutoCloseable. It closes these resources for you, so you don't have to worry about file-locks and remaining database connections:File file = new File("C:/text.txt");
try(Scanner scanner = new Scanner(file, "utf-8")){
//your code here ;)
}You also shouldn't throw
Exception in the main method of your program. This can be very confusing to users. Instead you main-method should handle all exceptions "gracefully" by being wrapped into a try-catch-block.Conditionals:
if(!Character.isLetter(c)){
continue;
}This is an early return statement for the purpose of following conditions, meaning you don't have to write
else if in your next condition.Naming
hashMap is not a good name. The map you use is not a Hash-Map, and treeMap would also not explain what the map does, what it contains.You might want to rename it to
characterMapall else equal, your naming is nice and consistent, and tells exactly what the variables do. You nicely follow
camelCase-conventions. Keep it up!Summary:
Your code reads nicely and is easily understandable. You follow naming conventions and have descriptive and understandable variable names. You should work on your exception handling and the use of resources.
Code Snippets
File file = new File("C:/text.txt");
try(Scanner scanner = new Scanner(file, "utf-8")){
//your code here ;)
}if(!Character.isLetter(c)){
continue;
}Context
StackExchange Code Review Q#47704, answer score: 19
Revisions (0)
No revisions yet.