Advertisement
failwind

a Character's Count in a File

Apr 25th, 2013
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.14 KB | None | 0 0
  1. /* 目標:檢查字串中 xxx 出現了多少次
  2.  *
  3.  * 情境:有一個字串裡面都是英文字, 請檢查a-z各出現多少次
  4.  * 方法1
  5.  * 將字串裏頭的字元取出, 然後檢查他的ASCII值,
  6.  * ASCII值符合的話, 該ASCII值的計數+1
  7.  *
  8.  * 取巧的方法, 因為英文字母的ASCII碼是連續的26個int
  9.  * 大寫26個, 小寫26個, 共52個
  10.  * 因為是連續的int, 所以可以用for去宣告
  11.  *
  12.  */
  13. public class IO_StringSearch {
  14.     static String strTemplate = "a1111";
  15.     /**
  16.      * @param args
  17.      */
  18.     public static void main(String[] args) {
  19.         // TODO Auto-generated method stub
  20. //      new IO_StringSearch().Q1fix(strTemplate);
  21.         new IO_StringSearch().Q2(strTemplate);
  22.     }
  23.    
  24.     public void Q1(String strInput){
  25.         /* 宣告一個int陣列共有27個元素
  26.          * 並初始化元素為0
  27.          */
  28.         int []count = new int[27];
  29.         for (int i = 0; i < count.length; i++) {
  30.             count[i]=0;
  31.         }
  32.         /* 基本概念
  33.          * 當 取出的字元 為 a 的時候
  34.          * count[a]++
  35.          * a的ASCII碼為97
  36.          * 所以上面可以替換為
  37.          * 當 取出的int為 97 的時候
  38.          * count[97]++ //這裡的意思是陣列count第97個元素其值++
  39.          *
  40.          * 光計算小寫a出現多少次,陣列就要至少宣告到97!!
  41.          * 好吧, 減掉97的話, count[a]就會等於count[0]
  42.          * 接下去到z不就只要宣告一個長度26的陣列
  43.          * 所以...
  44.          * 當取出的字元為a 的時候
  45.          * count[(int)a-97]++
  46.          *
  47.          * a是我們從一個字串裡面取出來的單一字元,
  48.          * 所以如果把a用char變數(姑且就命名為cx吧)取代的話..
  49.          * 當取出的字元為cx的時候
  50.          * count[(int)cx-97]++
  51.          *
  52.          * 而字串本身就是一個字元陣列
  53.          * 所以...
  54.          * 假設傳入的字元陣列為ch[]
  55.          * 把cx換成ch[i], i為從1到字元陣列長度任意一個數
  56.          * ex: 一個字串的長度為4, "abcd", 那麼他所構成的字元陣列
  57.          * 就是4, char[] ch = {'a','b','c','d'};
  58.          * 所以...
  59.          * 當取出的字元為ch[i]的時候
  60.          * count[(int)ch[i]-97]++
  61.          *
  62.          * 到了這裡, 除了作為基準用的-97以外,
  63.          * 檯面上的值已經換成了變數, 實作!!
  64.          */
  65.          /* strInput.toCharArray(), 把字串strInput轉變為一個字元陣列
  66.           * .length 長度
  67.           * 他是這樣變化的
  68.           * 01 strInput.toCharArray().length
  69.           *    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  70.           * 02 char[].length  //char[]表示匿名字元陣列
  71.           *    ¯¯¯¯¯¯
  72.           */
  73.         for (int i = 0; i < strInput.toCharArray().length; i++) {
  74.             /*
  75.              * 當i=0的時候, 取出strInput第一個位置的字元
  76.              * 將其轉為int, 再減掉97, 然後陣列count相對應位置的元素計數+1
  77.              * ex:
  78.              * 當i=0的時候, 字串strInput的第一個位置的字元為b
  79.              * 將b轉為int, 其值為98, 減掉97, 結果為1
  80.              * 則 count[1] = count[1] + 1
  81.              * 簡寫為 count[1]++
  82.              *
  83.              * 代表意義為字串strInput到第一個字元位置為止, b出現了1次
  84.              */
  85.             char[] ch = strInput.toCharArray();
  86.             count[(int)ch[i]-97]++;
  87.             /* 不過String本身就有提供方法
  88.              * strInput.length() - 回傳strInput的長度
  89.              * strInput.charAt(i) - 回傳strInput內位於i位置的字元
  90.              * 所以這個forloop可以改寫成 ... 請看Q1fix()
  91.              */
  92.         }
  93.     }
  94.     /* 修改過的Q1
  95.      * 這樣只能計算a-z, 萬一有a-z以外的符號呢 {}|)(_+ 都有可能會出現在字串中
  96.      * 詳細的先不討論, 直接排除吧
  97.      */
  98.     public void Q1fix(String strInput){
  99.         int count[] = new int[27];
  100.         for (int i = 0; i < strInput.length(); i++) {
  101.             /* 把範圍限制在a-z(97-122)之間
  102.              * 而其他符號的計數則算在一起
  103.              */
  104.             if ((int)strInput.charAt(i)>=97 && (int)strInput.charAt(i)<=122) {
  105.                 count[(int)strInput.charAt(i)-97]++;
  106.             } else {
  107.                 count[26]++;//注意這裡不是27而是26
  108.             }
  109.         }
  110.         dpg(count);//輸出
  111.     }
  112.     /* 好吧, 其實Q1fix只能計算小寫的a-z
  113.      * 如果source裡面含有大寫的A-Z呢?
  114.      * 在Q1fix裡面會全部歸到count[26]裡面 (汗)
  115.      *
  116.      * 全部轉成大寫或者小寫
  117.      *
  118.      * 大寫計算一遍, 小寫計算一遍, 然後
  119.      * 用  count[]++
  120.      *
  121.      */
  122.     public void Q2(String strInput){
  123.         int count1[] = new int[27];
  124.         int count2[] = new int[27];
  125.         for (int i = 0; i < strInput.length(); i++) {
  126.             if ((int)strInput.charAt(i)>=65 && (int)strInput.charAt(i)<=90) {
  127.                 count1[(int)strInput.charAt(i)-65]++;
  128.             } else if ((int)strInput.charAt(i)>=97 && (int)strInput.charAt(i)<=122) {
  129.                 count2[(int)strInput.charAt(i)-97]++;
  130.             } else {
  131.                 count1[26]++;
  132.             }
  133.         }
  134.        
  135.         for (int i = 0; i < count2.length; i++) {
  136.             count1[i] += count2[i];
  137.         }
  138.         dpg(count1);
  139.     }
  140.    
  141.    
  142.     /* 輸出用
  143.      *
  144.      * 為了美觀, 每5個 x[y] 斷行 一次
  145.      * 陣列最後一個拿來塞其他符號的計數另外用一行
  146.      * Other[y]來表示
  147.      *
  148.      */
  149.     public void dpg(int[] count){
  150.         System.out.println("各個英文字母的出現次數:");
  151.         for (int i = 0; i < count.length; i++) {
  152.             if (i != count.length-1) {
  153.                 System.out.print((char)(i+97)+"["+count[i]+"] ");
  154.             } else {
  155.                 System.out.print("\nOther "+"["+count[i]+"]");
  156.             }
  157.             if (i%5==4) {
  158.                 System.out.println();
  159.             }
  160.         }
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement