黑马程序员技术交流社区

标题: 关于TreeMap练习问题,求助! [打印本页]

作者: Rancho_Gump    时间: 2012-12-8 13:28
标题: 关于TreeMap练习问题,求助!
本帖最后由 张向辉 于 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    这是怎么回事,应怎么修改啊  求高手帮忙!

作者: 马志军    时间: 2012-12-8 15:26
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[],这怎么通过的,怎么回事?
作者: 赵保磊    时间: 2012-12-8 15:31
这是我写的,已测试可用,可以借鉴下:
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();
}
}

作者: 李桐    时间: 2012-12-8 15:38
同二楼问题啊,,楼上和楼主怎么吧ch给put进tm里的...
作者: Rancho_Gump    时间: 2012-12-9 09:36
本帖最后由 张向辉 于 2012-12-9 09:51 编辑

疯了  源码不是那样的  和2楼回复一样  只是我没有int强转,能执行结果,     我现在在高级编辑器里打出的中括号会在完成后隐藏,郁闷啊。。。。。    求助版主,怎么回事啊
这个程序的问题所在,我基本清楚了
中括号及其中的内容会隐藏怎么回事,求助!
作者: 赵保磊    时间: 2012-12-9 13:11
嗯 确实是
应该把tm.put(ch,1); 改成tm.put(ch[i],1);




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2