diff --git a/Others/TopKWords.java b/Others/TopKWords.java index 1e8eb00e..96139f68 100644 --- a/Others/TopKWords.java +++ b/Others/TopKWords.java @@ -1,11 +1,62 @@ -import java.io.*; -import java.util.*; +import java.io.*; +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) */ -public class TopKWords { - public static void main(String[] a) { +public class TopKWords { + static class CountWords { + private String fileName; + + public CountWords(String fileName) { + this.fileName = fileName; + } + + public Map getDictionary() { + Map 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 CountWords cw = new CountWords("/Users/lisanaaa/Desktop/words.txt"); Map dictionary = cw.getDictionary(); // get the words dictionary: {word: frequency} @@ -19,74 +70,15 @@ public class TopKWords { ); Scanner input = new Scanner(System.in); - Integer k = new Integer(input.nextLine()); + int k = input.nextInt(); while (k > list.size()) { System.out.println("Retype a number, your number is too large"); input = new Scanner(System.in); k = new Integer(input.nextLine()); } - for (int i = 0; i getDictionary() { - Map 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; - } -}