http://stackoverflow.com/questions/3169051/code-golf-word-frequency-chart
but it seems to fulfill all the requirements :)
import java.io.*; import java.util.*; public class WordFrequency { public static void main(String[] args) throws Exception { File f = new File(args[0]); final Map<String, Integer> map = new HashMap<String, Integer>(); BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream(f))); String line = ""; while ((line = br.readLine()) != null) { String[] words = line.toLowerCase().trim().replaceAll("[^a-z]", " ").split("\\s+"); for (String word : words) { word = word.trim(); if (!word.matches("the|and|of|to|a|o|i|i[tns]|or|")) { if (!map.containsKey(word)) { map.put(word, new Integer(1)); } else { map.put(word, map.get(word) + 1); } } } } List<string> sortedKeysByValue = new ArrayList<string>(map.keySet()); Collections.sort(sortedKeysByValue, new Comparator<string>() { @Override public int compare(String key1, String key2) { return map.get(key2).compareTo(map.get(key1)); } }); sortedKeysByValue = sortedKeysByValue.subList(0, 22); List<string> sortedKeysByLength = new ArrayList<string>(sortedKeysByValue); Collections.sort(sortedKeysByLength, new Comparator<string>() { @Override public int compare(String str1, String str2) { return Integer.valueOf(str2.length()).compareTo(Integer.valueOf(str1.length())); } }); String longestString = sortedKeysByLength.get(0); int maxWidth = 80 - 4 - longestString.length(); double scale = 1 / ((double) map.get(sortedKeysByValue.get(0)) / (double) maxWidth); double val = 0.0; for (String key : sortedKeysByValue) { val = ((double) map.get(key) / (double) maxWidth); double len = val * scale * maxWidth; System.out.print(" "); for (int n = 0; n < len; n++) { System.out.print("_"); } System.out.println(); System.out.print("|"); for (int n = 0; n < len; n++) { System.out.print("_"); } System.out.println("| " + key + " "); } } finally { if (br != null) { br.close(); } } } }
The 'cat WordFrequency.java | wc -m' gives me 2794 characters :p Anyway, I didn't bother to obfuscate my solution to make it shorter. It was all for fun. Enjoy! :)
No comments:
Post a Comment