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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Friendy89 中级黑马   /  2013-8-1 17:29  /  12595 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Friendy89 于 2013-8-4 23:25 编辑

  1. <P> </P>
复制代码
程序设计到最后怎么按次数进行排序,没有思路,还有就是输出字符串最后的逗号怎么去掉。

import java.util.Map;
import java.util.TreeMap;
/*
* 统计字符串“sdfvgzxcvasdvfxcvdf”中每个字符出现的次数,按次数排序并输出。
* 例如:a:1,g:1,z:1,c:2...
  */
public class MapAdvTest {
  public static void main(String[] args) {
  String str = "sdfvgzxcvasdvfxcvdf";
  String s = getCharCount(str);
  System.out.println(s);
}
public static String getCharCount(String str) {
  //1,将字符串变成字符数组
  char[] chs = str.toCharArray();
  
  //2,定义map集合用于存放字母和次数
  Map<Character,Integer> map = new TreeMap<Character,Integer>();
  
  //3,遍历字符数组,将遍历的字母和次数存放在map中
  for (int i = 0; i < chs.length; i++) {
   Integer value = map.get(chs);//这里是chs"["i"]",中括号不知打不出来,所以用引号扩了一下
   int count = 0 ;
   if(value!=null){
    count = value ;
   }
   count++;
   map.put(chs, count);//这里也跟上面一样
   
    }
  return mapToString(map);//将map集合转成字符串
}
public static String mapToString(Map<Character, Integer> map) {
  //定义一个容器,用于存放字符串
  StringBuilder sb = new StringBuilder();
  
  //遍历map集合
  for(Map.Entry<Character, Integer> me : map.entrySet()){
   Character key = me.getKey();
   Integer value = me.getValue();
   sb.append(key+":"+value+","); //这里怎么将最后一个字符串后面的逗号去掉
  }
  return sb.toString();
}
}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 代码放代码块中,会让别人方便复制.

查看全部评分

13 个回复

倒序浏览
代码好像有点错误,此处做下替换。
  1. //                for (int i = 0; i < chs.length; i++) {
  2. //                        Integer value = map.get(chs);
  3. //                        int count = 0;
  4. //                        if (value != null) {
  5. //                                count = value;
  6. //                        }
  7. //                        count++;
  8. //                        map.put(chs,count); //报错地方,char[]类型不符合Map中的Charactor类型
  9. //                }
  10.                
  11.                 //改为foreach循环
  12.                 for(Character fs : chs)
  13.                 {
  14.                         Integer value = map.get(fs);
  15.                         int count = 0;
  16.                         if (value != null) {
  17.                                 count = value;
  18.                         }
  19.                         count++;
  20.                         map.put(fs,count);
  21.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 Friendy89 于 2013-8-1 20:32 编辑
sergio 发表于 2013-8-1 20:14
代码好像有点错误,此处做下替换。


不好意思,上面for循环中有一个错误,
for (int i = 0; i < chs.length; i++) {
   Integer value = map.get(chs);//这里是chs"["i"]",中括号不知怎么没打出来,所以用引号扩了一下
   int count = 0 ;
   if(value!=null){
    count = value ;
   }
   count++;
   map.put(chs, count);//这里跟上面一样
   
    }
回复 使用道具 举报
  1. import java.io.BufferedReader;
  2. import java.io.FileReader;
  3. import java.io.IOException;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.Set;
  7. import java.util.TreeMap;

  8. public class Test06 {
  9.     public static void main(String[] args) {
  10.                 BufferedReader bufr = null;
  11.                 try {
  12.                         //读取文件中数据
  13.                         bufr = new BufferedReader(new FileReader("test.txt"));
  14.                         int line = 0;
  15.                         String strs = null;
  16.                         while((line=bufr.read())!=-1){
  17.                                 //这里过滤空格和\r \n
  18.                                 if(line!=32 && line!=13 && line!=10)
  19.                                         strs = strs + (char)line;;
  20.                         }
  21.                         System.out.println(charCount(strs));
  22.                 }catch (IOException e){
  23.                         throw new RuntimeException("数据读取失败");
  24.                 }
  25.                 //关闭流资源
  26.                 finally{
  27.                         try{
  28.                                 if(bufr!=null){
  29.                                         bufr.close();
  30.                                 }
  31.                         }catch (final IOException e){
  32.                                 throw new RuntimeException("关闭资源失败,因为对象实体为空!");
  33.                         }
  34.                 }
  35.     }
  36.     public static String charCount(String str){
  37.             char[] chs = str.toCharArray();
  38.         TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();//创建TreeMap集合。
  39.         //计数器表示字母出现的次数。
  40.         int count = 0;
  41.         for(int x=0;x<chs.length;x++){
  42.             Integer value = tm.get(chs[x]);
  43.             //如果value不为null,那么计数器的值为该value。计数器自增。
  44.             if(value!=null)
  45.                 count = value;
  46.             count++;
  47.             //把x角标上的字母和计数器作为键值对存入集合中。重置计数器
  48.             tm.put(chs[x],count);
  49.             count = 0;
  50.         }

  51.         //创建字符缓冲区、集合和迭代器
  52.         StringBuffer sb = new StringBuffer();
  53.         Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
  54.         Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
  55.         
  56.         //获取键值项,从键值项中获取key和value
  57.         //将key和value定义成指定字符串存入字符缓冲区。
  58.         while(it.hasNext()){
  59.             Map.Entry<Character,Integer> me = it.next();
  60.             Character ch = me.getKey();
  61.             Integer value = me.getValue();
  62.             sb.append(ch+":\t"+value+" 次\n");
  63.         }
  64.         //返回缓冲区的字符串表现形式。
  65.         return sb.toString();
  66.     }
  67. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报

你这代码完整吗,能把完整的代码发过来看看 吗?
这个题目是 统计字符串“sdfvgzxcvasdvfxcvdf”中每个字符出现的次数,按次数排序并输出。
例如:a:1,g:1,z:1,c:2...
回复 使用道具 举报
没看到哪里有插入代码块啊,求助
回复 使用道具 举报
Friendy89 发表于 2013-8-2 09:28
你这代码完整吗,能把完整的代码发过来看看 吗?
这个题目是 统计字符串“sdfvgzxcvasdvfxcvdf”中每个字 ...

比老老师有一个视频不是有讲这个的吗?虽然没有排序,但这个排序就简单了吧,
我上面的只不过是对文件内的所有字符进行统计,你把要统计的字母存在一个test.txt的文件里就行
回复 使用道具 举报
Jiewin 发表于 2013-8-2 17:07
比老老师有一个视频不是有讲这个的吗?虽然没有排序,但这个排序就简单了吧,
我上面的只不过是对文件内 ...


这个按自然顺序排序好做,但是要按次数排序我就做不好了
回复 使用道具 举报
哥们,要是按照次数排序的话, 你可以重写比较器    取出单词个数(value)比较 重写 Comparator 这个比较器 !
Comparator<Map.Entry<String, Integer>> comparator = new Comparator<Map.Entry<String, Integer>>() {}
你可以看看这个帖子:一道Java面试题  读取一片英文文章,输出其中出现单词的次数最多的5个.帖子地址 里面就是重写比较器按次数排序 你看看是不是你想要的

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
abian 发表于 2013-8-2 18:38
哥们,要是按照次数排序的话, 你可以重写比较器    取出单词个数(value)比较 重写 Comparator 这个比较 ...

谢了,研究一下
回复 使用道具 举报
我直接来个写好的,不多说上代码
  1. public class Test6 {

  2.         public static void main(String[] args) {
  3.                 Scanner sc = new Scanner(System.in);
  4.                 System.out.print("请输入您要统计的字符串:");
  5.                 String line = sc.nextLine();
  6.                 sc.close();
  7.                 char[] arr = line.toCharArray();
  8.                 TreeMap<Character, Integer> tm = new TreeMap<>();
  9.                 for (int i = 0; i < arr.length; i++) {
  10.                         char c = arr[i];
  11.                         tm.put(c, tm.containsKey(c) ? tm.get(c) + 1 : 1);
  12.                 }
  13.                 //System.out.println(tm);
  14.                 Set<Entry<Character, Integer>> entrySet = tm.entrySet();
  15.                 TreeSet<Entry<Character,Integer>> ts = new TreeSet<>(new Comparator<Entry<Character, Integer>>() {
  16.                         public int compare(Entry<Character, Integer> e1, Entry<Character, Integer> e2) {
  17.                                 int num = e1.getValue() - e2.getValue();
  18.                                 return num == 0 ? 1 : num;
  19.                         }
  20.                 });
  21.                 ts.addAll(entrySet);
  22.                 System.out.println(ts);
  23.         }

  24. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 很给力!

查看全部评分

回复 使用道具 举报
肥猫 发表于 2013-8-3 19:29
我直接来个写好的,不多说上代码

好吧,你这个代码我真心没看懂
回复 使用道具 举报
Friendy89 发表于 2013-8-3 20:29
好吧,你这个代码我真心没看懂

其实就是直接将TREEMAP里的键值对直接封装成对象再次放进TREESET里,在写个内部类比较器就可以了,当然拉,你要求的那个输出格式我没去弄.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马