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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 朱晓杰 于 2013-5-8 23:39 编辑

之前逛论坛的时候,看到了这个比较活跃的活动,当时自己看了一下题目,感觉挺不错的,自己尝试做了一下,可悲的是,当时没有完全做完,在学习了String,集合之后,自己将这道题重新整理了一下,完全符合题目的要求,挺高兴的,再接再厉!论坛真是太强大了!对各位的敬佩又升级咧!下面将自己的代码贴上,请各位给出批评意见。

  /**
         * 题目: 已有字符串str1="sdfg,hellozx,sdfcv-waadfa,fsasdfxcvdf"
         *
         * 键盘输入任意字符串,例如:String str2="HaHahello01",
         *
         * 在原来字符串str1中去掉str2中最大的交集字符串(hello)后, 获取该字符串str1中的每个字母出现的次数。
         *
         * 例如:去掉hello后
         *
         * 以这种方式打印:按字母出现次数排序,次数相同时,按字母从大到小排序!
         *
         * 输出:f(出现6次)d(出现5次)s(出现4次)x(出现2次)v(出现2次)c(出现2次)w(出现1次)g(出现1次)
         *
         */
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.Map;
  5. import java.util.Scanner;
  6. import java.util.TreeMap;
  7. import java.util.Map.Entry;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;

  10. public class MixSortStr {

  11.         public static void main(String[] args) {
  12.                 StringBuilder str1 = new StringBuilder("sdfg,hellozx,sdfcv-waadfa,fsasdfxcvdf");// 已有字符串

  13.                 Scanner scan = new Scanner(System.in);

  14.                 System.out.println("请输入任意字符串:");

  15.                 String str2 = scan.nextLine();
  16.                
  17.                 String sub = getMixString(str1.toString(),str2);//最大的交集字符串
  18.                
  19.                 int start = str1.indexOf(sub);//sub在str1中第一次出现的位置
  20.                
  21.                 int end = start + sub.length();
  22.                
  23.                 str1 = str1.delete(start,end);//str1中去掉str2中最大的交集字符串
  24.                
  25.                 TreeMap treeMap = finder(str1);
  26.                
  27.                 ArrayList<Map.Entry<String, Integer>> arl = new ArrayList<Map.Entry<String, Integer>>(treeMap.entrySet());
  28.                
  29.                 Collections.sort(arl,new Comparator<Map.Entry<String, Integer>>() {

  30.                         public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
  31.                                 int num = o1.getValue().compareTo(o2.getValue());
  32.                                 if(num == 0){
  33.                                         num = o2.getKey().compareTo(o1.getKey());
  34.                                 }
  35.                                 return num;
  36.                         }
  37.                 });
  38.                
  39.                 for(Map.Entry<String, Integer> entry : arl) {
  40.                         String key = entry.getKey().toString();
  41.                         int count = entry.getValue();
  42.                         System.out.print(key + "(出现"+count+"次)");
  43.                 }
  44.                
  45.         }
  46.         /**
  47.          * 功能:获取两个字符串的最大交集字符串(可能是多个相同长度的字符串)
  48.          * @param:max(长的字符串)
  49.          * @param:min(短的字符串)
  50.          * @param;sub(截取的字符串)
  51.          * */
  52.         private static String getMixString(String str1, String str2) {
  53.                 String max = (str1.length() > str2.length() ? str1 : str2);
  54.                 String min = max.equals(str1) ? str2 : str1;
  55.                 for (int i = 0; i < min.length(); i++) {
  56.                         for (int start = 0, end = min.length() - i; end != min.length() + 1; start++, end++) {
  57.                                 String sub = min.substring(start, end);
  58.                                 if (max.contains(sub))
  59.                                         return sub;
  60.                         }
  61.                 }
  62.                 return null;
  63.         }
  64.         
  65.         /**功能:统计字符出现次数
  66.          * @param myTreeMap:存放字符串统计后 的结果
  67.          * @param regex:匹配的正则表达式
  68.          * @param
  69.          * */
  70.         public static TreeMap<Object, Integer> finder(StringBuilder source) {
  71.                 TreeMap<Object, Integer> myTreeMap = new TreeMap<Object, Integer>();//存放统计结果后的容器
  72.                 String regex = "[a-zA-Z]+";//匹配的正则表达式
  73.                 Object word = null,num = null;
  74.                 Integer count;//计数器
  75.                 StringBuilder regexNew = new StringBuilder();
  76.                 char[] ch = source.toString().toCharArray();
  77.                 for(int i = 0; i < ch.length; i++){
  78.                         regexNew.setLength(0);
  79.                         regexNew.append(ch<i>);
  80.                         if (regexNew != null && !regexNew.equals("")) {
  81.                                 regex = regexNew.toString();
  82.                         }
  83.                         Matcher matcher = Pattern.compile(regex).matcher(source);
  84.                      
  85.                         while (matcher.find()) {
  86.                                 word = matcher.group();
  87.                                 if (myTreeMap.containsKey(word)) {
  88.                                         num = myTreeMap.get(word);
  89.                                         count = (Integer) num + 1;
  90.                                 } else
  91.                                         count = new Integer(1);                                
  92.                                 myTreeMap.put(word, count);
  93.                         }
  94.                         count = null;
  95.                 }
  96.                 return myTreeMap;
  97.         }
  98. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
曹睿翔 + 2 比我写的好

查看全部评分

8 个回复

倒序浏览
尹桥印 发表于 2013-5-8 20:22
顶楼主啊,这个题目可以收藏下呐

我也是上次逛论坛的时候看到的,一直没有写出来,终于给整出来了!
回复 使用道具 举报
尹桥印 发表于 2013-5-8 20:27
等我把视频看完后,再来看你们写的这些代码,看你们代码的精彩之处。确实不错 ...

恩恩,一起努力,我还有好多东西没有学会呢!
回复 使用道具 举报
呀,朱终于整出来。。。不错
回复 使用道具 举报
代码优美、注释详尽,可以加上author和version了
回复 使用道具 举报
写版主,版主谦虚了,我是参考了好多代码才搞出来的,论坛真是太强大了!
回复 使用道具 举报
hou604720966 发表于 2013-5-8 20:59
呀,朱终于整出来。。。不错

是啊,正则那块还有点儿模糊,还有就是排序!
回复 使用道具 举报
{:soso_e179:}可以啊顶一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马