テキスト内の単語の数を統計し、出現回数でソートします(Java--mapの値ソートとキーソート)
12622 ワード
主に2つの部分に分けられる:1.まず入力単語を処理します:mapインタフェースを使って、単語はキーで、出現回数は値です.単語の中の特殊記号を文字列内部の方法で置き換えて、単語が重複しているかどうかによって、新しいキー値のペアを書き込むか、単語(キー)に対応する出現回数(値)を増加します.
2.さらに構築されたmapオブジェクトをタイプ変換する:個人理解(具体的な原理はMap.EntryとMap.entrySet()を自分で学ぶことができる):キー値対を一つの全体と見なす.この全体がlistの要素の具体的なタイプであり、mapをlistに変えることで、自分でlistの比較方法を書くことができる
3.最後にcomparatorを継承するクラスを書き、compareメソッドを書き換え、このメソッドでCollectionsを実現する.sort()はlistをソートすればよい
2.さらに構築されたmapオブジェクトをタイプ変換する:個人理解(具体的な原理はMap.EntryとMap.entrySet()を自分で学ぶことができる):キー値対を一つの全体と見なす.この全体がlistの要素の具体的なタイプであり、mapをlistに変えることで、自分でlistの比較方法を書くことができる
3.最後にcomparatorを継承するクラスを書き、compareメソッドを書き換え、このメソッドでCollectionsを実現する.sort()はlistをソートすればよい
import java.util.*;
import java.util.Map.Entry;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, Integer> words = new TreeMap<String, Integer>();
String input;
while(true) {
input = sc.next();
if(input.equals("!!!!!")) {
break;
}
input = input.toLowerCase().replaceAll("[!.,:*?]", "");
if(words.get(input)==null) {
words.put(input, 1);
}
else {
int times = words.get(input);
words.put(input, ++times);
}
}
System.out.println(words.size());
Iterator it;
List<Map.Entry<String, Integer>> change = new ArrayList<Map.Entry<String, Integer>>(words.entrySet());
Collections.sort(change,new mapValueandKeyCompare());
int flag=0;
for(it=change.iterator();it.hasNext();) {
flag++;
System.out.println(it.next());
if (flag==10) {
break;
}
}
}
}
class mapValueandKeyCompare implements Comparator<Map.Entry<String, Integer>>{
@Override
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
if(o1.getValue()>o2.getValue()) {
return -1;
}
else if(o1.getValue()<o2.getValue()) {
return 1;
}
else {
return o1.getKey().compareTo(o2.getKey());
}
}
}