利用JavaScript获取字符串中出现次数最多的字符

         之前遇到过这样一个问题:有一个字符串,包含各种字符,利用js,如何找到其中出现次数最多的字符?

       好吧首先要承认,作为一个小白的我,当时遇到这个问题的时候,脑子里只想到了利用数组然后进行遍历,后来对面向对象有了更深了解后,才知道这个问题还可以用对象来解决,而且用对象要比用数组来解决更合适。


---------------------------------------------------------哔哔完毕,开始正题,我是分界线-------------------------------------------------


OK,下面进入正题,先来确认一遍问题。

问题:假如str  =  "abcdabcaba12,??.aaaaaa",利用js,找出其中出现次数最多的字符。

解决办法:

1、利用数组

先来粘代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>js找出出现次数最多的字符</title>
<script type="text/javascript" src="arrayTest.js"></script>
</head>
<body>
<div id = "str"></div>
<div id="chars"></div>
<div id="charTimes"></div>
</body>
</html>
window.onload = function(){
	var str ="abcdabcaba12,??.aaaaaa";
	var arr = [];
	for(var i =0;i<str.length;i++){
	    var index = -1;
            var j = 0;
	    do{
		index = str.indexOf(str[i],index+1);
		if(index!=-1){
		    j++;
		}
	    }while(index!=-1)
	    arr[j] = str[i];//j就是i出现的次数
	}
	document.getElementById("str").innerHTML = "字符串是:"+ str;
	document.getElementById("chars").innerHTML = "出现次数最多的字符是:" + arr[arr.length-1];
	document.getElementById("charTimes").innerHTML = "出现的次数是:" + (arr.length - 1);
	console.log(arr);
}
运行结果如图:


方法分析:

       数组方法的思想就是设置一个数组arr,字符串中的字符出现i次,就将该字符放在arr[i]中。即字符出现多少次就该字符放到对应下标的数组元素中。获取字符出现的次数利用循环和indexOf方法,indexOf()每找到一次该字符的下标时,就将下次调用该函数的起始位置设为index+1。然后再利用循环,遍历字符串中的每一个字符。

       但是利用数组的方法存在一个问题,就是相同出现次数的字符只能有一个。所以如果当两个或多个字符出现相同次数时,arr数组中只保留了一个字符,而且保留的是出现相同次数字符下边最大的一个也就是最后找到的那个字符。所以用数组这种办法只能找到一个出现次数最多的字符。这个问题可以用对象方法来解决。


2、利用对象

代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>js找出出现次数最多的字符</title>
<script type="text/javascript" src="objectTest.js"></script>
</head>
<body>
<div id = "str"></div>
<div id="chars"></div>
<div id="charTimes"></div>
</body>
</html>
window.onload = function(){
	var str ="abcdabcaba12,??.aaaaaa";
	var o = {};
	for(var i=0;i<str.length;i++){
	    var char = str.charAt(i);
	    if(o[char]){ //char是对象o的一个属性,o[char]是属性值,o[char]控制出现的次数
		o[char]++;
	    }else{
		o[char] = 1; //若第一次出现,次数记为1
	    }
	}
	console.log(o);//输出完整的对象,记录每一个字符及其出现的次数
	//遍历对象,找到出现次数最多的字符和次数
	var maxTimes = 0;
	var maxChar = null;
	for(var key in o){
	    if(maxTimes<o[key]){
		maxTimes = o[key];//max始终存储次数最大的那个
			
	    }
	}
	for(var key in o){
	    if(o[key] == maxTimes){
		document.getElementById("str").innerHTML = "字符串是:"+ str;
		document.getElementById("chars").innerHTML = "出现次数最多的字符是:" + key;
		document.getElementById("charTimes").innerHTML = "出现的次数是:" + o[key];
	    }
	}
	
}

运行结果截图:



方法分析: 

       利用对象方法的思想是将字符串中的每个字符作为一个属性,然后字符出现的次数作为该属性的属性值。同样也是利用循环来遍历字符串,判断字符是否已经存在于对象o中,如果存在,则属性值加一,如果不存在则为第一次出现该字符,在对象o中添加该属性,且属性值设为1。最后遍历对象,找出最大的出现次数maxTimes,然后找出对象中所有属性值为maxTimes的属性,即为出现次数最多的字符。

       利用对象的方法解决了利用数组存在的问题,即出现次数最多的字符不能有多个的问题。所以如果之后再遇到类似问题,可以考虑利用对象来解决。



如果有什么问题请大家指正,转载请注明出处。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值