《TIJ》第11章练习8
复习TreeMap的排序,TreeMap跟TreeSet一样,可以在构造函数中通过导入Comparator指定排序的方式。
8、修改WordCount.java,使它能够依据字母顺序进行排序。请使用第9章的工具。
注:由于在上例已经使用了AlphabeticComparator.class,在同一目录下,这次可以直接调用。TreeSet、TreeMap原来都可以在构造函数中加入Comparator对象,使之以这个Comparator指定的方法排序啊。
//: c11:WordCount.java
// Count words from a file, outputs
// results in sorted form.
import java.io.*;
import java.util.*;
class Counter {
private int i = 1;
int read() {
return i;
}
void increment() {
i++;
}
}
public class WordCount {
private FileReader file;
private StreamTokenizer st;
// A TreeMap keeps keys in sorted order:
private TreeMap counts = new TreeMap(new AlphabeticComparator());
WordCount(String filename)
throws FileNotFoundException {
try{
file = new FileReader(filename);
st = new StreamTokenizer(
new BufferedReader(file));
st.ordinaryChar('.');
st.ordinaryChar(',');
}catch(FileNotFoundException e){
System.err.println(
"Could not open " + filename);
throw e;
}
}
void clearup(){
try{
file.close();
}catch(IOException e){
System.err.println(
"file.close() upsuccessful");
}
}
void countWords(){
try{
while(st.nextToken() != st.TT_EOF){
String s;
switch(st.ttype) {
case StreamTokenizer.TT_EOL:
s = new String("EOL");
break;
case StreamTokenizer.TT_NUMBER:
s = Double.toString(st.nval);
break;
case StreamTokenizer.TT_WORD:
s = st.sval;
break;
default: // single character in ttype
s = String.valueOf((char)st.ttype);
}
if(counts.containsKey(s)){
((Counter)counts.get(s)).increment();
}else{
counts.put(s,new Counter());
}
}
}catch(IOException e){
System.err.println(
"st.nextToken() unsuccessful");
}
}
Collection values(){
return counts.values();
}
Set keySet(){
return counts.keySet();
}
Counter getCounter(String s){
return (Counter)counts.get(s);
}
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args)
throws FileNotFoundException {
// TODO: Add your code here
WordCount wc =
new WordCount(args[0]);
wc.countWords();
Iterator keys = wc.keySet().iterator();
while(keys.hasNext()){
String key = (String)keys.next();
System.out.println(key + ": "
+ wc.getCounter(key).read());
}
wc.clearup();
}
}