A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Rancho_Gump 高级黑马   /  2012-12-8 13:28  /  2630 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2012-12-9 09:41 编辑

import java.util.*;
class TreeMapDemo
{
public static void main(String[] args)
{
  String str="aaabcca";
  TreeMap<Character,Integer> tr = new TreeMap<Character,Integer>();
  char[] ch=str.toCharArray();
  for(int i=0;i<ch.length;i++)//我的思路是在数组中就找出各个字符出现的次数并直接添加到集合中,不过结果显示是不成功的,这个能改么?
  {
   int num=0;
   for(int n=i;n<ch.length;n++)
   {
    if(str.indexOf(ch,n)!=-1)
    {
       num=num+1;
     n=str.indexOf(ch,n);
    }
   }
      tr.put(ch,num);
   }
  Set<Map.Entry<Character,Integer>> set=tr.entrySet();
  Iterator<Map.Entry<Character,Integer>> it=set.iterator();
  while(it.hasNext())
  {
   Map.Entry<Character,Integer> map=it.next();
   System.out.print(map.getKey()+"("+map.getValue()+")");
  }
}
}
打印结果:a(1)b(1)c(1)
---------------------------------------------------------------------
我的打印的结果不管键出现几次,值总是1    这是怎么回事,应怎么修改啊  求高手帮忙!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
1.我查了API,String的indexOf方法里没有接收数组作为参数的。if(str.indexOf(ch,n)!=-1)是想说if(str.indexOf((int)ch[n],n)!=-1)?
2.tr.put(ch,num);第一个参数应该是字符,但传的是字符数组类型的。
3.就算上面没问题了,但代码
  for(int n=i;n<ch.length;n++)
    {
     if(str.indexOf(ch,n)!=-1)
     {
        num=num+1;
      n=str.indexOf(ch,n);
     }
    }
比如n开始为1,找ch[1]这个字符,最后num得到个5,外循环的i是一个一个递增,比如ch[1]这个字符是b,最后出现的位置是ch[8],当你i增加到8时,里面的循环又开始找b这个字符,因为后面没有了,所以num肯定为1,再调用put方法,键相同,原来的值5会被此时的1取代.
4.暂时就看出这么些问题,我没去运行,不清楚具体情况。
5.你说打印出结果了,值是1,那说明可以编译运行,但是比如TreeMap<Character,Integer>,明显键是Character型,但tr.put(ch,num),ch是char[],这怎么通过的,怎么回事?

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这是我写的,已测试可用,可以借鉴下:
import java.util.*;
class MapDemo3
{
public static void main(String[] args)
{
String s=charCount("abfdfdjfieaa");
System.out.println(s);
}
public static String charCount(String str)
{
char[] ch=str.toCharArray();

TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
//泛型里接受的都是引用数据类型。找到其类型对应的基本数据包装类
for(int i=0; i<ch.length; i++)
{
Integer value=tm.get(ch);//根据键获取值
if(value==null)
{
tm.put(ch,1);
}
else
{
value=value + 1;
tm.put(ch,value);
}
}

StringBuilder sb=new StringBuilder();

Set<Character> se=tm.keySet();
Iterator<Character> it=se.iterator();

while (it.hasNext())
{
Character key=it.next();
Integer v=tm.get(key);
sb.append(key+"("+v+")");

}
return sb.toString();
}
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
同二楼问题啊,,楼上和楼主怎么吧ch给put进tm里的...
回复 使用道具 举报
本帖最后由 张向辉 于 2012-12-9 09:51 编辑

疯了  源码不是那样的  和2楼回复一样  只是我没有int强转,能执行结果,     我现在在高级编辑器里打出的中括号会在完成后隐藏,郁闷啊。。。。。    求助版主,怎么回事啊
这个程序的问题所在,我基本清楚了
中括号及其中的内容会隐藏怎么回事,求助!
回复 使用道具 举报
嗯 确实是
应该把tm.put(ch,1); 改成tm.put(ch[i],1);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马