テキスト内の単語の数を統計し、出現回数でソートします(Java--mapの値ソートとキーソート)

12622 ワード

主に2つの部分に分けられる:1.まず入力単語を処理します:mapインタフェースを使って、単語はキーで、出現回数は値です.単語の中の特殊記号を文字列内部の方法で置き換えて、単語が重複しているかどうかによって、新しいキー値のペアを書き込むか、単語(キー)に対応する出現回数(値)を増加します.
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());
		}
	}
	
}