Update TopKWords.java

All has been improved according to your advice.
This commit is contained in:
Keqi Huang 2018-04-08 17:04:17 -05:00 committed by GitHub
parent df1b68b9ee
commit 68d945077e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,11 +1,62 @@
import java.io.*; import java.io.*;
import java.util.*; import java.util.*;
/* display the most frequent K words in the file and the times it appear /* display the most frequent K words in the file and the times it appear
in the file shown in order (ignore case and periods) */ in the file shown in order (ignore case and periods) */
public class TopKWords { public class TopKWords {
public static void main(String[] a) { static class CountWords {
private String fileName;
public CountWords(String fileName) {
this.fileName = fileName;
}
public Map<String, Integer> getDictionary() {
Map<String, Integer> dictionary = new HashMap<>();
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName); // open the file
int in = 0;
String s = new String(); // init a empty word
in = fis.read(); // read one character
while (-1 != in) {
if (Character.isLetter((char)in)) {
s += (char)in; //if get a letter, append to s
} else {
// this branch means an entire word has just been read
if (s.length() > 0) {
// see whether word exists or not
if (dictionary.containsKey(s)) {
// if exist, count++
dictionary.put(s, dictionary.get(s) + 1);
} else {
// if not exist, initiate count of this word with 1
dictionary.put(s, 1);
}
}
s = ""; // reInit a empty word
}
in = fis.read();
}
return dictionary;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// you always have to close the I/O streams
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
public static void main(String[] args) {
// you can replace the filePath with yours // you can replace the filePath with yours
CountWords cw = new CountWords("/Users/lisanaaa/Desktop/words.txt"); CountWords cw = new CountWords("/Users/lisanaaa/Desktop/words.txt");
Map<String, Integer> dictionary = cw.getDictionary(); // get the words dictionary: {word: frequency} Map<String, Integer> dictionary = cw.getDictionary(); // get the words dictionary: {word: frequency}
@ -19,74 +70,15 @@ public class TopKWords {
); );
Scanner input = new Scanner(System.in); Scanner input = new Scanner(System.in);
Integer k = new Integer(input.nextLine()); int k = input.nextInt();
while (k > list.size()) { while (k > list.size()) {
System.out.println("Retype a number, your number is too large"); System.out.println("Retype a number, your number is too large");
input = new Scanner(System.in); input = new Scanner(System.in);
k = new Integer(input.nextLine()); k = new Integer(input.nextLine());
} }
for (int i = 0; i<k; i++) { for (int i = 0; i < k; i++) {
System.out.println(list.get(list.size()-i-1)); System.out.println(list.get(list.size() - i - 1));
} }
} }
} }
class CountWords {
private String fileName;
public CountWords(String fileName) {
this.fileName = fileName;
}
public Map<String, Integer> getDictionary() {
Map<String, Integer> dictionary = new HashMap<>();
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName); // open the file
int in = 0;
StringBuffer sb = new StringBuffer(); // load the word
in = fis.read(); // read one character
boolean notEnd = true; // signal whether is the end of file
while (notEnd) {
// when in == -1 means get the end of the file
if (-1 == in) {
notEnd = false; //if false, end the while loop
}
if (Character.isLetter((char)in)) {
sb.append((char)in); //if get a letter, put it in StringBuffer
} else {
// this branch means an entire word has just been read
if (sb.length() > 0) {
//see whether word exists in StringBuffer or not
if (dictionary.containsKey(sb.toString())) {
//if exist, count++
dictionary.put(sb.toString(), dictionary.get(sb.toString()) + 1);
} else {
// if not exist, initiate count of this word with 1
dictionary.put(sb.toString(), 1);
}
}
sb = new StringBuffer(); //reload the StringBuffer
}
in = fis.read(); //read the character
}
return dictionary;
}
catch (IOException e) {
e.printStackTrace();
}
finally {
try {
// you always have to close the I/O streams
fis.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}