本帖最后由 朱晓杰 于 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次)
*
*/- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Map;
- import java.util.Scanner;
- import java.util.TreeMap;
- import java.util.Map.Entry;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- public class MixSortStr {
- public static void main(String[] args) {
- StringBuilder str1 = new StringBuilder("sdfg,hellozx,sdfcv-waadfa,fsasdfxcvdf");// 已有字符串
- Scanner scan = new Scanner(System.in);
- System.out.println("请输入任意字符串:");
- String str2 = scan.nextLine();
-
- String sub = getMixString(str1.toString(),str2);//最大的交集字符串
-
- int start = str1.indexOf(sub);//sub在str1中第一次出现的位置
-
- int end = start + sub.length();
-
- str1 = str1.delete(start,end);//str1中去掉str2中最大的交集字符串
-
- TreeMap treeMap = finder(str1);
-
- ArrayList<Map.Entry<String, Integer>> arl = new ArrayList<Map.Entry<String, Integer>>(treeMap.entrySet());
-
- Collections.sort(arl,new Comparator<Map.Entry<String, Integer>>() {
- public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
- int num = o1.getValue().compareTo(o2.getValue());
- if(num == 0){
- num = o2.getKey().compareTo(o1.getKey());
- }
- return num;
- }
- });
-
- for(Map.Entry<String, Integer> entry : arl) {
- String key = entry.getKey().toString();
- int count = entry.getValue();
- System.out.print(key + "(出现"+count+"次)");
- }
-
- }
- /**
- * 功能:获取两个字符串的最大交集字符串(可能是多个相同长度的字符串)
- * @param:max(长的字符串)
- * @param:min(短的字符串)
- * @param;sub(截取的字符串)
- * */
- private static String getMixString(String str1, String str2) {
- String max = (str1.length() > str2.length() ? str1 : str2);
- String min = max.equals(str1) ? str2 : str1;
- for (int i = 0; i < min.length(); i++) {
- for (int start = 0, end = min.length() - i; end != min.length() + 1; start++, end++) {
- String sub = min.substring(start, end);
- if (max.contains(sub))
- return sub;
- }
- }
- return null;
- }
-
- /**功能:统计字符出现次数
- * @param myTreeMap:存放字符串统计后 的结果
- * @param regex:匹配的正则表达式
- * @param
- * */
- public static TreeMap<Object, Integer> finder(StringBuilder source) {
- TreeMap<Object, Integer> myTreeMap = new TreeMap<Object, Integer>();//存放统计结果后的容器
- String regex = "[a-zA-Z]+";//匹配的正则表达式
- Object word = null,num = null;
- Integer count;//计数器
- StringBuilder regexNew = new StringBuilder();
- char[] ch = source.toString().toCharArray();
- for(int i = 0; i < ch.length; i++){
- regexNew.setLength(0);
- regexNew.append(ch<i>);
- if (regexNew != null && !regexNew.equals("")) {
- regex = regexNew.toString();
- }
- Matcher matcher = Pattern.compile(regex).matcher(source);
-
- while (matcher.find()) {
- word = matcher.group();
- if (myTreeMap.containsKey(word)) {
- num = myTreeMap.get(word);
- count = (Integer) num + 1;
- } else
- count = new Integer(1);
- myTreeMap.put(word, count);
- }
- count = null;
- }
- return myTreeMap;
- }
- }
复制代码 |