使用map数据结构统计词频

数据结构字典(map)

map数据结构在各种语言里面都有者自己的实现。

nodejs里面的对象本身就是一个键值对形式,虽然nodejs里面有Map类,不过我们也可以直接用对象进行map操作。

c++的stl标准库历尽无数的考验,无论是性能,还是稳定性都有保证,我们可以直接使用里面的数据结构。

java有map接口,我们可以选择TreeMap或者HashMap去进行词频统计。他们之间的区别是TreeMap会根据传入的key进行排序,底层使用红黑树排序,节约空间。HashMap底层使用数组,查找,删除,增加快,但是会消耗空间。读者可以根据自己的场景选择合适的数据结构。

golang有天生自带的数据结构,数组和字典是golang自带的数据结构。Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。

下面我将演示用这四种语言的map统计词频。

nodejs

let string = 'I like apple,do you like apple' //测试语句

string = string.split(/[ ,]/) //正则表达式用空格和逗号分割字符串

console.log('分割后,字符串数组为:',string)

/*****使用obj统计词频******/
let obj={}

for(let str of string){
    if((obj[str]|0)===0){
        obj[str]=1
    }else{
        obj[str]=obj[str]+1
    }
}

console.log(obj)
/******************

{ I: 1, like: 2, apple: 2, do: 1, you: 1 }
可以看到,已经统计好词频了

******************/

c++

#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
int main(){

    string sentance ="I like apple,do you like apple";//测试语句

    vector<string> words ;//声明字符串数组

    int start=0,end=0;

 /***************分割字符串*****************/
    for(int i=0;i<sentance.size();i++){
        if(sentance[i]==' '||sentance[i]==','){
            end=i;
            if(end!=start)
            words.push_back(sentance.substr(start,end-start));
            start=i+1;
        }else if(i==sentance.size()-1){
            end=i;
            words.push_back(sentance.substr(start,end-start+1));
        }
    }

 /*************遍历字符串****************/
    for(string str:words){
        cout<<"word:"<<str<<endl;
    }

    cout<<"*********************"<<endl;//分割符

    map<string,int> dict;//声明字典

    for(string word:words){

        dict[word]++; //统计词频

    }

    for(auto it : dict){

       cout<<"key:"+it.first+" value:"<<it.second<<endl;//遍历字典

   }

}





 

java


public class TestApp {
    public static void main(String[] args) {
        String sentance = "I like apple,do you like apple";//测试字符串
        String []words=sentance.split("[ ,]");
        System.out.println("分割字符串");
        for(String word:words){
            System.out.println(word);
        }

        Map<String,Integer> map= new HashMap<>();
        for(String word:words){
            map.put(word,map.getOrDefault(word,0)+1);
        }

        System.out.println("遍历字典");

        for(String key:map.keySet()){
            System.out.println(key+":"+map.get(key));
        }
    }
}

 

 golang

package main

import (
	"fmt"
	"strings"
)
//自定义分割函数
func split(r rune) bool {
	return r == ' ' || r == ','
}

func main() {
    //测试语句
	str := "I like apple,do you like apple"
	words := strings.FieldsFunc(str, split)
	for _, value := range words {
		fmt.Println(value)
	}

	m := make(map[string]int)

	for _, value := range words {
		m[value]++
	}

	for key, value := range words {
		fmt.Println(key)
		fmt.Println(value)
	}
}

经过笔者的对比,各种语言之间各有千秋。nodejs比较简短,适合操作字符串,c++分割字符串需要手动实现,不过map数据结构的实现比较简单,非常方便调用。Java不用说了,相信很多人用的比我还要溜。golang语言语法跟c差不过,风格简单。

猜你喜欢

转载自blog.csdn.net/weixin_42815827/article/details/128499502