假設(shè)現(xiàn)在有一個(gè)很長(zhǎng)的字符串(只包括英文字母),現(xiàn)在需要統(tǒng)計(jì)長(zhǎng)字符串中每個(gè)字母字符出現(xiàn)的次數(shù)。
暫時(shí)想出以下兩種方法:
package com.sphere.letters;import java.util.ArrayList;import java.util.HashMap;import java.util.List;/** * 統(tǒng)計(jì)長(zhǎng)字符串中每個(gè)字母字符出現(xiàn)的次數(shù)(區(qū)分大小寫) * 并以 <字符,出現(xiàn)次數(shù)> 的鍵值對(duì)形式返回 */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]); } //循環(huán)對(duì)比 假定沒有一個(gè)重復(fù)的元素 則循環(huán)基數(shù)為size() int length = list.size(); while(length > 0){ //某個(gè)字符出現(xiàn)的次數(shù) list首個(gè)元素不再比較之列 int count = 1; for (int i = 1; i < length; i++) { //每次拿list的第一個(gè)字符 與之后的所有字符對(duì)比 if(0 == list.get(0).compareTo(list.get(i))){ //存在相同的就從list中移除 //并且長(zhǎng)度減1,出現(xiàn)次數(shù)加1, //i減1,下次還從此索引檢測(cè),以防連續(xù)字母出現(xiàn)時(shí)跳過的情況 list.remove(i); length--; count++; i--; } } //移除第一個(gè)字符 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("元素個(gè)數(shù):"+list.size()); **************FOR TEST*******************/ } System.out.println(map); return map; }}
也可以利用26個(gè)英文字母的特殊性得到字母出現(xiàn)的次數(shù)
我們可以建立一個(gè)int[] array = new int[26] 的數(shù)組,
英文字母具有特殊性 字母對(duì)應(yīng)ASCII編碼中的某個(gè)值
以字母A或者a為基數(shù) 將每個(gè)字符和A或者a相減,并將對(duì)應(yīng)位置的值加1
private static int[] array = new int[26]; //英文字母具有特殊性 字母對(duì)應(yīng)ASCII編碼中的某個(gè)值 //以字母A或者a為基數(shù) 將每個(gè)字符和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*******************/ }
感覺這兩種方法效率都不是很高,哪位有更好的辦法還請(qǐng)留言告知一下,謝謝。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注