最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用java編寫一個字符串詞頻統(tǒng)計工具

 更新時間:2025年06月12日 11:01:43   作者:風輕云淡的開發(fā)  
許多培訓機構(gòu)都會出幾本高頻詞匯的書,主要內(nèi)容是統(tǒng)計近幾年來各類考試中屢次出現(xiàn)的高頻詞匯,幫助考生減少需要背的生詞的數(shù)量,下面我們來看看如何使用java編寫一個字符串詞頻統(tǒng)計工具吧

許多英語培訓機構(gòu)(如新東方)都會出幾本“高頻詞匯”的書,主要內(nèi)容是統(tǒng)計近幾年來各類外語考試中屢次出現(xiàn)的高頻詞匯,幫助考生減少需要背的生詞的數(shù)量。但這些高頻是如何被統(tǒng)計出來的呢?顯然不會用手工去計算。

假如我們已經(jīng)將一篇文章存在一字符串(String)對象中,為了統(tǒng)計詞匯出現(xiàn)頻率,最簡單直接的做法是另外建一個Map:key是單詞,value是 次數(shù)。將文章從頭讀到尾,讀到一個單詞就到Map里查一下,如果查到了則次數(shù)加一,沒查到則往Map里一扔。

/**
 * Java中提供一個非常棒的HashMap函數(shù),只需要一步就可以統(tǒng)計單詞的頻率
 */


import java.util.HashMap;

public class WordMap {

	public static void main(String[] args) {
		String input = "a1,b2,3c,d4d,a1,b2,a1";
		String[] ws = input.split(",");
		// 做的單詞分割,
		// 如果你要空格分割 String[] ws = input.split(" ");
		HashMap<String, Integer> hm = new HashMap<String, Integer>();
		// 初始化HashMap
		for (String s : ws) {
			if (s.matches("[a-zA-Z]\\w+"))
			// 這里是一個正則表達式,
			// 判斷的是第一個必須是字母,
			// 后面的是一個字母或多個字母,
			// 一個數(shù)字或多個數(shù)字
			{
				Integer cou = hm.get(s);
				// get()方法將產(chǎn)生一個與鍵相關(guān)聯(lián)的Integer值,
				// 然后這個值被遞增,為的是記錄標識符的個數(shù)
				hm.put(s, cou == null ? 1 : cou + 1);
				// 保存到HashMap中以單詞做key,判斷單詞是否為空,空為1,或則加1
			}
		}
		System.out.println(hm);
		// 打印HashMap
	}
}

這樣做雖然代碼寫起來簡單,但性能卻非常差。首先查詢Map的代價是O(logn),假設(shè)文章的字母數(shù)為m,則整個統(tǒng)計程序的時間復雜度為O(mlogn)不說,如果要拿高頻詞可能還需要對統(tǒng)計結(jié)果進行排序。即便對結(jié)構(gòu)上進行優(yōu)化性能仍然不高。如果能夠?qū)r間復雜度從O(mlogn)減少到O(m)的話不是更好?

為了改進算法我們首先引進單詞樹。與單詞前綴樹不同,單詞樹的結(jié)構(gòu)相當簡單,結(jié)構(gòu)如圖所示:

從圖中我們可以看出,樹中每個結(jié)點保存屬性值cnt與指向其26個子結(jié)點的指針(每一條路徑代表一個英文字母),其中cnt為到達該結(jié)點經(jīng)過路 徑所對應的英文單詞在文章中出現(xiàn)的次數(shù)。也就是說,我們開始讀文章時讓一個指針指向單詞數(shù)的根結(jié)點,之后每讀一個字母就讓該指針指向當前結(jié)點對應路徑上的子結(jié)點(若子結(jié)點為空則新建一個),一個單詞讀完后讓當前結(jié)點的cnt值加一,并讓指針重新指向根結(jié)點。而當一篇文章讀完之后我們的單詞樹也就已經(jīng)建立完 畢了。之后只要去遍歷它并把取到的單詞根據(jù)次數(shù)進行排序就行了(時間復雜度為O(nlogn))。

程序代碼如下,

首先是存放單詞及出現(xiàn)次數(shù)的JavaBean

public class WordCount {
    private String word;
    
    private int count;
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public String getWord() {
        return word;
    }
    public void setWord(String word) {
        this.word = word;
    }
}

其次是實現(xiàn)詞頻表生成算法的類:

public class WordCountService {
    
    /**
     * 根據(jù)文章生成單詞樹
     * @param text
     * @return
     */
    private static CharTreeNode geneCharTree(String text){
        CharTreeNode root = new CharTreeNode();
        CharTreeNode p = root;
        char c = ' ';
        for(int i = 0; i < text.length(); ++i){
            c = text.charAt(i);
            if(c >= 'A' && c <= 'Z')
                c = (char)(c + 'a' - 'A');
            if(c >= 'a' && c <= 'z'){
                if(p.children[c-'a'] == null)
                    p.children[c-'a'] = new CharTreeNode();
                p = p.children[c-'a'];
            }
            else{
                p.cnt ++;
                p = root;
            }
        }
        if(c >= 'a' && c <= 'z')
            p.cnt ++;
        return root;
    }
    
    /**
     * 使用深度優(yōu)先搜索遍歷單詞樹并將對應單詞放入結(jié)果集中
     * @param result
     * @param p
     * @param buffer
     * @param length
     */
    private static void getWordCountFromCharTree(List result,CharTreeNode p, char[] buffer, int length){
        for(int i = 0; i < 26; ++i){
            if(p.children[i] != null){
                buffer[length] = (char)(i + 'a');
                if(p.children[i].cnt > 0){
                    WordCount wc = new WordCount();
                    wc.setCount(p.children[i].cnt);
                    wc.setWord(String.valueOf(buffer, 0, length+1));
                    result.add(wc);
                }
                getWordCountFromCharTree(result,p.children[i],buffer,length+1);
            }
        }
    }
    
    private static void getWordCountFromCharTree(List result,CharTreeNode p){
        getWordCountFromCharTree(result,p,new char[100],0);
    }
    
    /**
     * 得到詞頻表的主算法,供外部調(diào)用
     * @param article
     * @return
     */
    public static List getWordCount(String article){
        CharTreeNode root = geneCharTree(article);
        List result = new ArrayList();//此處也可用LinkedList鏈表,以避免數(shù)組滿了擴容導致的性能損失
        getWordCountFromCharTree(result,root);
        Collections.sort(result, new Comparator(){
            public int compare(Object o1, Object o2) {
                WordCount wc1 = (WordCount)o1;
                WordCount wc2 = (WordCount)o2;
                return wc2.getCount() - wc1.getCount();
            }
        });
        return result;
    }
}
/**
 * 單詞樹結(jié)點的定義
 * @author FlameLiu
 *
 */
class CharTreeNode{
    int cnt = 0;
    CharTreeNode[] children = new CharTreeNode[26];
}

到此這篇關(guān)于使用java編寫一個字符串詞頻統(tǒng)計工具的文章就介紹到這了,更多相關(guān)java詞頻統(tǒng)計內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java將m3u8格式轉(zhuǎn)成視頻文件的方法

    java將m3u8格式轉(zhuǎn)成視頻文件的方法

    這篇文章主要介紹了如何java將m3u8格式轉(zhuǎn)成視頻文件,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • springboot?實戰(zhàn):異常與重定向問題

    springboot?實戰(zhàn):異常與重定向問題

    這篇文章主要介紹了springboot實戰(zhàn):異常與重定向問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Redis6搭建集群并在SpringBoot中使用RedisTemplate的實現(xiàn)

    Redis6搭建集群并在SpringBoot中使用RedisTemplate的實現(xiàn)

    本文主要介紹了Redis6搭建集群并在SpringBoot中使用RedisTemplate,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java源碼解析HashMap成員變量

    Java源碼解析HashMap成員變量

    今天小編就為大家分享一篇關(guān)于Java源碼解析HashMap成員變量,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • SpringCloud Gateway跨域配置代碼實例

    SpringCloud Gateway跨域配置代碼實例

    這篇文章主要介紹了SpringCloud Gateway跨域配置代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot應用War包形式部署到外部Tomcat的方法

    SpringBoot應用War包形式部署到外部Tomcat的方法

    這篇文章主要介紹了SpringBoot應用War包形式部署到外部Tomcat的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 利用POI讀取word、Excel文件的最佳實踐教程

    利用POI讀取word、Excel文件的最佳實踐教程

    Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。 下面這篇文章主要給大家介紹了關(guān)于利用POI讀取word、Excel文件的最佳實踐的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • SpringBoot @Test單元測試方式

    SpringBoot @Test單元測試方式

    這篇文章主要介紹了SpringBoot @Test單元測試方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • mybatis-plus實現(xiàn)邏輯刪除的示例代碼

    mybatis-plus實現(xiàn)邏輯刪除的示例代碼

    在大多數(shù)公司里,都會采用邏輯刪除的方式,本文主要介紹了mybatis-plus實現(xiàn)邏輯刪除的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • java性能調(diào)優(yōu)System的gc垃圾回收方法

    java性能調(diào)優(yōu)System的gc垃圾回收方法

    這篇文章主要為大家介紹了java性能調(diào)優(yōu)System的gc垃圾回收方法示例解析有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-03-03

最新評論

定陶县| 邵武市| 陆丰市| 江北区| 临湘市| 西乌珠穆沁旗| 徐水县| 青铜峡市| 鸡泽县| 梅州市| 迁安市| 田阳县| 临城县| 大化| 梅河口市| 衡阳市| 于田县| 汝城县| 通海县| 淳化县| 宽甸| 泸西县| 宜春市| 博客| 察隅县| 龙泉市| 蒙城县| 上饶县| 板桥市| 武穴市| 邵阳市| 杭州市| 徐汇区| 昌都县| 来凤县| 建德市| 原阳县| 繁峙县| 霍邱县| 修文县| 礼泉县|