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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵学刚 中级黑马   /  2012-12-4 22:15  /  1445 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵学刚 于 2012-12-5 00:19 编辑

问题:大家帮我看看哪错了,我找了好久都不知道错在哪了,感觉都对了,怎么就是没输出呢。。。。。。谢谢
  1. public class TreeMapTest {

  2.         /**
  3.          * 需求:计算字符串中字母出现的次数并以a(1)、b(6)的格式打印
  4.          * 思路:看到需求是以映射形式存储,所以考虑用map集合
  5.          *     1、将字符串转换成字符数组
  6.          *     2、定义一个map集合,因为打印结果字母顺序有序所以用TreeMap
  7.          *     3、遍历字符数组:
  8.          *       将数组中字母作为键去查map集合
  9.          *       如果返回为NUll将字母和1存入集合
  10.          *       如果返回不为NUll键不变,值自加1再重新存入集合
  11.          *     4、将map集合中的数据按给定格式输出
  12.          */
  13.         public static String   treeMapTest(String s){
  14.                 char []ch=s.toCharArray();
  15.                 int count=0;
  16.                 Map<Character,Integer> map=new TreeMap<Character,Integer>();
  17.                 for(int i=0;i<ch.length;i++){
  18.                         
  19.                           Integer  value = null;
  20.                         if(!((ch[i]>'a'&&ch[i]<'b')||(ch[i]>'A'&&ch[i]<'B')))
  21.                                  value = map.get(ch[i]);
  22.                         if(value!=null)
  23.                                 count=value;
  24.                           count++;
  25.                           count=0;
  26.                
  27.                 }
  28.                 StringBuilder sb=new StringBuilder();
  29.                 Set<Map.Entry<Character, Integer>> entrySet=map.entrySet();
  30.                 Iterator<Map.Entry<Character, Integer>> it=entrySet.iterator();
  31.                 while(it.hasNext()){
  32.                         Map.Entry<Character, Integer> me=it.next();
  33.                         Character chs=me.getKey();
  34.                         Integer   value=me.getValue();
  35.                         sb.append(chs+"("+value+")");
  36.                 }
  37.                
  38.         return  sb.toString();        
  39.         }
  40.         public static void main(String[] args) {
  41.                
  42.                 System.out.println(TreeMapTest.treeMapTest("adfdfdfdsfsdfsdfsfadfsfs"));

  43.         }

  44. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
if(!((ch>'a'&&ch<'b')||(ch>'A'&&ch<'B')))
这句话肯定是true啊,,没有false的可能,
Map<Character,Integer> map=new TreeMap<Character,Integer>();刚声明了一个map,没有赋值,就应用value = map.get(ch);这样value肯定全部是null啊,,然后下面Set<Map.Entry<Character, Integer>> entrySet=map.entrySet();这有又用map,还是那句,没有赋值,你到底想干什么啊 ,没看懂

回复 使用道具 举报
本帖最后由 罗会涛 于 2012-12-4 23:51 编辑

先贴代码
  1. import java.util.Iterator;
  2. import java.util.Map;
  3. import java.util.Set;
  4. import java.util.TreeMap;

  5. public class TreeMapTest
  6. {

  7.         /**
  8.          * 需求:计算字符串中字母出现的次数并以a(1)、b(6)的格式打印 思路:看到需求是以映射形式存储,所以考虑用map集合 1、将字符串转换成字符数组
  9.          * 2、定义一个map集合,因为打印结果字母顺序有序所以用TreeMap 3、遍历字符数组: 将数组中字母作为键去查map集合
  10.          * 如果返回为NUll将字母和1存入集合 如果返回不为NUll键不变,值自加1再重新存入集合 4、将map集合中的数据按给定格式输出
  11.          */
  12.         public static String treeMapTest(String s)
  13.         {
  14.                 char[] ch = s.toCharArray();
  15.                 int count = 0;
  16.                 Map<Character, Integer> map = new TreeMap<Character, Integer>();
  17.                 for (int i = 0; i < ch.length; i++)
  18.                 {

  19.                         Integer value = null;
  20.                         if ((ch[i] >='a' && ch[i] <= 'z') || (ch[i] >='A' && ch[i] <= 'Z'))
  21.                                 value = map.get(ch[i]);
  22.                         if (value != null)
  23.                                 count = map.get(ch[i]);
  24.                         count++;
  25.                         map.put(ch[i], count);
  26.                         count = 0;
  27.                 }
  28.                 StringBuilder sb = new StringBuilder();
  29.                 Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
  30.                 Iterator<Map.Entry<Character, Integer>> it = entrySet.iterator();
  31.                 while (it.hasNext())
  32.                 {
  33.                         Map.Entry<Character, Integer> me = it.next();
  34.                         Character chs = me.getKey();
  35.                         Integer value = me.getValue();
  36.                         sb.append(chs + "(" + value + ")");
  37.                 }

  38.                 return sb.toString();
  39.         }

  40.         public static void main(String[] args)
  41.         {
  42.                 System.out.println(TreeMapTest.treeMapTest("adfdfdfdsfsdfsdfsfadfsfs"));
  43.         }
  44. }
复制代码
你的思路写得很好,但是代码不是按你思路来写的
         *     3、遍历字符数组:
         *       将数组中字母作为键去查map集合
         *       如果返回为NUll将字母和1存入集合
         *       如果返回不为NUll键不变,值自加1再重新存入集合
"将数组中字母作为键去查map集合",这里就错了,你写的是if(!((ch>'a'&&ch<'b')||(ch>'A'&&ch<'B'))),可能是笔误将b与z写错了
         *       如果返回为NUll将字母和1存入集合
         *       如果返回不为NUll键不变,值自加1再重新存入集合
你又没有这么做,代码中还从来没有往map中put过任何数据,怎么会有结果呢
25与26行代码
                          count++;
                          count = 0;
少了map.put(ch, count);
count自增完还没有用就复位为0了,应该是很容易看到的.
回复 使用道具 举报
这是 老师视频课 讲了的 看看视频,老师讲得细的很
回复 使用道具 举报
嗯  谢谢大家   
回复 使用道具 举报
楼主你的思路有了,但是把握好怎么使用集合来做
我给你提供了两个方法:
方法一是使用集合做的,就是按照你的思想来做
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class Demo2
{
/**
  * @param args
  * 计算字符串中字母出现的次数并以a(1)、b(6)的格式打印
       abcdabcdfgr
  */
public static void main(String[] args)
{
  String str="abcdabcdfgr";
  method(str);
}
public static void method(String str)
{
  
  char[] ch=str.toCharArray();
  for(char c:ch)
  {
   System.out.print(c+" ");
  }
  System.out.println();
  TreeMap<Character,Integer> tp=new TreeMap<Character,Integer>();
  int conunt=1;
  for (int i = 0; i < ch.length; i++)
  {

      if (!tp.containsKey(ch))
   {
    tp.put(ch, 1);
   }
      else
      {
                 conunt=tp.get(ch)+1;
        tp.put(ch, conunt);
        
      }

  }
  Set<Character> set=tp.keySet();
  Iterator<Character> it=set.iterator();
  while (it.hasNext())
  {
   Character key = it.next();
   Integer value=tp.get(key);
   System.out.print(key+"("+value+")");
   
  }
  
}
}
这是第二种方法,使用的是结合正则表达式做的
你可以参考下:
public class Test2
{
  public static void main(String[] args )
{
       String str="abcdabcdfgr";
       String st1 = str.replaceAll("(?s)(.)(?=.*\\1)", "");
       String st2=st1.replaceAll("[0-9]", "");
       //System.out.println(st2);
       String st;
  for (int i = 0; i <st2.length(); i++)
  {
   st=st2.substring(i,i+1);
      int index=show(str,st);
     System.out.print(st+"("+index+")");
  }
  
  
}

public static int show(String str,String st)
{
      int count=0;
   for (int j =0;  j< str.length(); j++)
   {
    String s=str.substring(j, j+1);
    if (st.equals(s))
    {
     count++;
    }
   
   }
  return count;
}

}


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马