Pages

2010年10月2日 星期六

Java String 依照單字出現次數/頻率高的依序印出

功能:
依照每個單字出現的次數,由大到小,排列印出。

假設:
String oriString = "This is a book. That is a pencil"

輸出:
is 出現 2 次
a 出現 2 次
This 出現 1 次
That 出現 1 次
book 出現 1 次
pencil 出現 1 次

程式碼:
import java.util.regex.*;
import java.util.*;

public class StringSort {
 public static void main(String[] args){
  String oriString = "This is a book. That is a pencil.";
  Pattern p = Pattern.compile("\\w[^\\.\\s]*");
  Matcher m = p.matcher(oriString);
  
  Set<string> sortVerb = new TreeSet<string>();
  ArrayList<string> strArray = new ArrayList<string>();
  while(m.find()){
   strArray.add(m.group());
   sortVerb.add(m.group());
  }

  //計算oriString中的各個單字的次數
  int[] verbCount = new int[sortVerb.size()];
  int index = 0;
  for(String s : sortVerb){
   int count = 0;
   for(String sr : strArray){
    if(s.equals(sr))
     count++;
   }
   verbCount[index++] = count;
  }

  //開始排序
  int[] indexArray = new int[sortVerb.size()];
  for(int i = 0; i < indexArray.length; i++)
   indexArray[i] = i;
  int temp, indexTemp;
  index = 0;
  for (int f = 1; f < sortVerb.size(); f++) {
      if (verbCount[f] < verbCount[f-1])
       continue;
      temp = verbCount[f];
      indexTemp = indexArray[f];
      index = f-1;
      while ((index >= 0)&&(verbCount[index] < temp)) {
       verbCount[index+1] = verbCount[index];
       indexArray[index+1] = indexArray[index];
       index--;
      }
      verbCount[index+1]=temp;
      indexArray[index+1] = indexTemp;
  }
  Object[] printStr = sortVerb.toArray();
  for(int i = 0; i < indexArray.length; i++)
   System.out.println(printStr[indexArray[i]].toString()+"出現 "+verbCount[i]+"次");
 }
}

執行結果:
a出現 2次
is出現 2次
That出現 1次
This出現 1次
book出現 1次
pencil出現 1次

0 意見: