黑马程序员技术交流社区
标题:
字符串中求字符出现的次数?
[打印本页]
作者:
付凯鹏
时间:
2013-11-29 16:26
标题:
字符串中求字符出现的次数?
/*获取一个字符串中每个字符出现的次数。例如:"abkabklok"打印输出a(2)b(2)k(3)l(1)o(1)
*/
public class String_5{
public static void main(String[] args){
stringCount();
}
public static void stringCount(){
String str="abkkajjuda";
char[] ch=str.toCharArray();
for(int i=0;i<str.length();i++){
int count=0;
int index=0;
while((index=str.indexOf(ch[i],index))!=-1){
index++;
count++;
}
System.out.print(ch[i]+"("+count+")");
}
}
}
我这种方法输出的结果有重复,该如何改善才能避免重复,前面字符a已经求出出现次数,后边那个字符a就不求了?在原有基础上加以改进。求各位大神们解决一下,一直没想出好的解决方法。多谢了。。
作者:
yangjie
时间:
2013-11-29 20:41
本帖最后由 yangjie 于 2013-11-29 21:01 编辑
class String_5{
public static void main(String[] args){
stringCount();
}
public static void stringCount(){
TreeMap<Character,Integer> treemap = new TreeMap<Character,Integer>();
String str ="aabcaadk76qoq";
for(int i=0;i<str.length();i++){
char ch = str.charAt(i);
if(('a'<= ch && ch <='z')||('A'<= ch && ch <='Z')){
Integer n = treemap.put(ch,null);
if(n == null){
treemap.put(ch,1);
}else{
treemap.put(ch,++n);
}
}
}
System.out.println(treemap);//输出略过
}
}
复制代码
这个用到了集合
数组的:
class String_5{
public static void main(String[] args){
stringCount();
}
public static void stringCount(){
String str ="aabcaadk76qoq";
char[] chs=str.toCharArray();
for(int i=0;i<chs.length-1;i++){
char ch = chs[i];
int num = 1;
if(('a'<= ch && ch <='z')||('A'<= ch && ch <='Z')){
for(int j = i+1;j<chs.length;j++){
if(ch == chs[j]){
num ++;
chs[j] = ' ';//把计算过的字符替换掉
}
}
System.out.print(ch +"("+ num+")");
}
}
}
}
复制代码
我也有这道题,当时没做出来……
作者:
魏-玉-彪
时间:
2013-11-29 21:13
哥要告诉你,这样是不完美的
请看哥的分析:
* 1 根据Map键值不允许重复的特点,我样可以将字母和字母的个数以键值对的方式存入Map中,
* 由于这里并没有要求按指定规则排序,因此我们采用TreeMap的自然排序。
* 2根据要求,只统计字母,因此我们采用在统计过程中只对字符编码在 65-90,97-122之间的
* 字符进行统计。
*
*
* 步骤:
* 1 定义要进行统计的字符串;
* 2定义一个Map,用其键值对进行计数;
* 3 将字符串转为字符数组进行遍历并存入Map;
* 4打印输出
*
*
public class Test1 {
public static void main(String[] args) {
//1 定义要进行统计的字符串;
String s="abcdekka27qoq";
//2定义一个Map,用其键值对进行计数;
TreeMap <Character, Integer> hm= new TreeMap<Character,Integer>();
//3 将字符串转为字符数组进行遍历;
char []chs=s.toCharArray();
//增强for;
for(char c:chs){
// 只统计字母,因此我们采用在统计过程中只对字符编码在 65-90,97-122之间的
// 字符进行统计。
if((65<=c&c<=90)||(97<=c&c<=122)){
//通过get()方不获取字母的值,如果值为null说明Map中没有这个字母,
//将字母做为键值存入 ,并将设其个数为1做为value值存入其中
if(hm.get(c)==null){
hm.put(c, 1);
}
//如果不为空说明其中有这个字母,将字个数加1后存入其中。
else{
hm.put(c,hm.get(c)+1);
}
}
}
// 获取 Map的键 集合,并 遍历Map ,此时Map中的键值对即为
// 字母和个数。
Set<Character > keys= hm.keySet();
for(char key:keys ){
// 4打印输出 根据需求格式输出。
System.out.print( key+"("+ hm.get(key)+")");
}
}
}
复制代码
作者:
段光宇
时间:
2013-11-30 12:47
package com.itheima;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
public class Test4 {
public static void main(String[] args) {
//定义字符串并初始化
String s = new String("abcdekka27qoq");
//定义Map集合,我们用key存放元素,用value存放元素出现的次数,运用泛型限制添加元素的类型
Map<Character,Integer> map = new TreeMap<Character,Integer>();
char[] ch = s.toCharArray();//将字符串转换为数组!
System.out.println(ch);//打印出作为参照
//利用java5新特性增强型for循环,对这个数组进行迭代!
for (char c : ch) {
//取出数组中的元素后进行判断map集合中是否存在此元素,也就是说是否是第一次出现
if(!map.containsKey(c)){
map.put(c, 1);//是第一次出现的话就把这个元素添加进来,并把value的值赋为1
}else{//集合中存在,就是说不是第一次出现的话就把它的次数增加1。
Integer val = map.get(c);//取得它出现的次数。
val+=1;//将次数增加1
map.put(c, val);
}
}
//利用entrySet()方法将map集合转化为set集合,这样的话就可以使用Iterator接口进行迭代!
Set<Entry<Character, Integer>> set = map.entrySet();
Iterator<Entry<Character, Integer>> it = set.iterator();//利用方法iterator()返回Iterator对象
//进行遍历
while(it.hasNext()){
//利用泛型的好处:消除了强转的麻烦。next()方法返回了map的内部接口Entry
Entry<Character, Integer> entry = it.next();
//利用方法getKey()和getValue()完成输出!
System.out.print(entry.getKey()+"("+entry.getValue()+")");
}
}
}
复制代码
作者:
FFF
时间:
2013-12-2 00:14
同学、问题已经解决了吗?
如果没有、就去新版28期问吧,26~27已经结束了。开班了!
http://bbs.itheima.com/forum-165-1.html
作者:
贾浩田
时间:
2014-9-27 14:43
yangjie 发表于 2013-11-29 20:41
这个用到了集合
数组的:
这个数组的做法不对啊,请楼主三思
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2