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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大漠孤烟 中级黑马   /  2014-5-5 22:48  /  1976 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package com.itheima.connection;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapDemo {

        /**
         *1.取出一个字符串中字母出现的次数。如:字符串如:"abcde%^kka27qoq" ,打印每个字母出现的次数如:a(2)b(1)k(2)..
         *分析:1.字母与数字 之间存在映射关系,每个字母都对应出现的次数,用到Map集合
         *   2. 保证数据的唯一性,保证按照 abcdefg 字母顺序排序 用到Map子类TreeMap集合
         *   3.遍历集合,用字母作为键存储到Map中,存在就字母对应的取值+1存到集合中,字母相同的会覆盖
         *   4.循环遍历结束Map集合存储的就是字母对应的次数
         */
        public static void main(String[] args) {
                String str = "abcdekka27qoA*&AAAq";
                ToCharArray(str);


        }
       
        private static String ToCharArray(String str) {
                char[] chr = str.toCharArray(); //字符串转换为字符串数组,方便遍历

                Map<Character, Integer> map = new TreeMap<Character, Integer>();
                             int count=0;
                           for(int i=0;i<chr.length;i++){
                                   if(chr[i]>='a'&&chr[i]<='z'&&chr[i]>='A'&&chr[i]<='Z'){
                                          
                                   // 将字母作为键存放Map中,Integer接收字母
                                   Integer value=map.get(chr[i]);
                                
                              
                                   if(value!=null)
                                           count=value;
                                           count++;
                                         
                                   
                                   map.put(chr[i], count);
                                   count=0;
                                   }
                                  
                           }
                                   //保存将从集合中迭代出来的字母和次数
                                   StringBuilder sbl=new StringBuilder();
                                    //Map 转成Set
                                   //Set keySet=map.keySet();
                                   Iterator it=map.keySet().iterator();
                                   while(it.hasNext()){
                                          // Character key=it.next();
                                          // Integer values=map.get(key);
                                       Map.Entry<Character, Integer> me =(Entry<Character, Integer>) it.next();  
                                       //加到容器sb中  
                                       sbl.append(me.getKey() + "(" + me.getValue() + ")");
                                   }
                          
                          
                                return sbl.toString();
             }
}
执行结果没有任何反应
这几天看视频,有这样的练习题,我检查了几遍也纳闷不知道哪里出错了,希望大虾门帮忙看一下

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

5 个回复

倒序浏览
楼主:1,首先ToCharArray方法返回String类型值,你没接(应System.out.println(ToCharArray()),就永不会有结果;
          2,你下面刚用完keySet方法又接着用entrySet,导致整个Iterator都没用上,所以才报“你使用了不安全的方法”。

我是单用keySet做的,简单易懂,你看看(已测试):

package demo;

import java.util.*;

class TreeMapDemo
{
public static void main(String[] args)
{
  String str="sdajdjahds&^^%j&^7asd";
  String result=getCount(str);
  System.out.println(result);
}

public static String getCount(String str)
{
  //将字符串转成数组
  char[] arr=str.toCharArray();
  Map<Character,Integer> map=new TreeMap<Character,Integer>();
  for(int x=0;x<arr.length;x++)
  {
   if(!(arr[x]>='a'&&arr[x]<='z'||arr[x]>='A'&&arr[x]<='Z'))
   {
    continue;
   }

   //根据键得到值
   Integer value=map.get(arr[x]);
   int count=1;
   if(value!=null)
   {
    count=value+1;
   }

   //将键和值加到map集合中去
   map.put(arr[x],count);
  }
  return ksDemo(map);
}

private static String ksDemo(Map<Character,Integer> map)
{
  StringBuilder sb=new StringBuilder();
  //用keySet方法遍历
  Iterator<Character> it=map.keySet().iterator();
  while(it.hasNext())
  {
   Character key=it.next();
   Integer value=map.get(key);
   sb.append(key+"("+value+")");
  }
  return sb.toString();
}
}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
楼主,1.我加了System.out.println(ToCharArray())还是没打印出来
          2.keySet 方法我都注释掉了,Map转Set 迭代遍历我是想用两种方式都测试一下。
         3.楼主的确实可以,分开写清晰多了,不过我还是挺纳闷。。多谢啦。。。。。
回复 使用道具 举报
我将你的代码改了一下,你可以看看。我分别使用了map.keySet()方法和map.entrySet()方法。运行过了,可是实现的所要求的功能。
import java.util.*
public class Test {
        public static void main(String[] args) {
                String str = "abcdekka27qoA*&AAAq";
                System.out.println(ToCharArray(str));
        }
       
        private static String ToCharArray(String str) {
                char[] chr = str.toCharArray(); //字符串转换为字符串数组,方便遍历

                Map<Character, Integer> map = new TreeMap<Character, Integer>();
                int count=0;
            for(int i=0;i<chr.length;i++){
                    if((chr>='a' && chr<='z') || (chr>='A' && chr<='Z')){        //这条语句是重点  
                                // 将字母作为键存放Map中,Integer接收字母
                                Integer value=map.get(chr);
                                if(value!=null)
                                   count=value;
                                count++;
                                map.put(chr, count);
                                count=0;
                    }
                          
                }
                //保存将从集合中迭代出来的字母和次数
                StringBuilder sb=new StringBuilder();
                //Map 转成Set,使用keySet
                Set<Character> keySet = map.keySet();
                Iterator<Character> it = keySet.iterator();
                while(it.hasNext()){
                        Character key = it.next();
                        Integer values = map.get(key);
                        //Map.Entry<Character, Integer> me =(Entry<Character, Integer>)it.next();  
                        //加到容器sb中  
                        //sb.append(key + "(" + values + ")");
                }

                //使用Map.Entry,它的用法你可以参看毕老师的视频和、API文档。
                Set<Map.Entry<Character, Integer>> entrySet = map.entrySet();
                Iterator<Map.Entry<Character, Integer>> it1 = entrySet.iterator();
                while(it1.hasNext())
                {
                        Entry<Character, Integer> entry = it1.next();
                        Character key = entry.getKey();
                        Integer value = entry.getValue();
                        sb.append(key + "(" + value + ")");
                        //System.out.println(it1.next().getClass().getName());
                }
                return sb.toString();
        }
}

回复 使用道具 举报
多谢楼市兄弟,还是粗心大意啊  第二个判断条件不能用&&  要用||或。。。
回复 使用道具 举报
相互学习下,可能不太准确  

import java.util.*;
class MapTest
{
      public static void main(string[] str)
       {
             charcount("asbbdsdsdqt");
        }
      
      public static string charcount(string str)
       {
           char[] = str.toCharArray();
           TreeMap<Charactor,Integer> tm = new TreeMap<Charactor,Integer>();
           for(int x=0; x<chs.length;x++)
            {
              Integer value = tm.get(chs[x]);
              if(value==null)
               {
                    tm.put(chs[x],1);
                }
               else
                {
                     value = value+1;
                     tm.put(chs[x],value);
                 }
             }
            system.out.println(tm);
            return null;
        }
               
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马