假設現在有一個很長的字符串(只包括英文字母),現在需要統計長字符串中每個字母字符出現的次數。
暫時想出以下兩種方法:
package com.sphere.letters;import java.util.ArrayList;import java.util.HashMap;import java.util.List;/** * 統計長字符串中每個字母字符出現的次數(區分大小寫) * 并以 <字符,出現次數> 的鍵值對形式返回 */public class Test { PRivate static String TEST = "AWQEYIOAHDHDKKLDLAHFHJALAFHANNAFGJCXCKBZCQIEO" + "PADHAZBZVCFGCSHDJCKCLDMDHFAKAIIAYQO"; public static void main(String[] args) { getMapByArray(TEST); } private static HashMap<Character, Integer> getMapByArray(String str){ char[] array = str.toCharArray(); List<Character> list = new ArrayList<Character>(); HashMap<Character, Integer> map = new HashMap<Character, Integer>(); for (int i = 0; i < array.length; i++) { list.add(array[i]); } //循環對比 假定沒有一個重復的元素 則循環基數為size() int length = list.size(); while(length > 0){ //某個字符出現的次數 list首個元素不再比較之列 int count = 1; for (int i = 1; i < length; i++) { //每次拿list的第一個字符 與之后的所有字符對比 if(0 == list.get(0).compareTo(list.get(i))){ //存在相同的就從list中移除 //并且長度減1,出現次數加1, //i減1,下次還從此索引檢測,以防連續字母出現時跳過的情況 list.remove(i); length--; count++; i--; } } //移除第一個字符 map.put(list.get(0), count); list.remove(0); length--; /**************FOR TEST******************* for (Character ch : list) { System.out.print(ch); } System.out.println(); System.out.println("元素個數:"+list.size()); **************FOR TEST*******************/ } System.out.println(map); return map; }}
也可以利用26個英文字母的特殊性得到字母出現的次數
我們可以建立一個int[] array = new int[26] 的數組,
英文字母具有特殊性 字母對應ASCII編碼中的某個值
以字母A或者a為基數 將每個字符和A或者a相減,并將對應位置的值加1
private static int[] array = new int[26]; //英文字母具有特殊性 字母對應ASCII編碼中的某個值 //以字母A或者a為基數 將每個字符和A或者a相減 private static void getCharCountsByASCII(String str){ char temp ; for (int i = 0; i < str.length(); i++) { temp = str.charAt(i); if(temp >= 'A' && temp <='Z'){ array[temp - 'A']++; }else if(temp >= 'a' && temp <='z') { array[temp - 'a']++; }else { } } /**************FOR TEST*******************/ for (int i = 0; i < array.length; i++) { System.out.print(array[i]+" "); } /**************FOR TEST*******************/ }
感覺這兩種方法效率都不是很高,哪位有更好的辦法還請留言告知一下,謝謝。
新聞熱點
疑難解答