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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ゞSunペ果果つ 中级黑马   /  2013-4-18 12:16  /  1650 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ゞSunペ果果つ 于 2013-4-19 07:17 编辑
  1. import java.util.*;
  2. public class Test14
  3. {
  4.         public static void main(String []args){
  5.         String str=StringTool.containString("ahellodsaf");
  6.         System.out.println(str);
  7.         StringTool.StringCount(str);
  8.         }

  9. }
  10. class  StringTool
  11. {
  12.                 public static String containString(String s2){
  13.                 String s1="sdfg,hellozx,sdfcv-waadfa,fsasdfxcvdf";
  14.                 String xs=null;
  15.                 flag:
  16.                 for(int i=0;i<s1.length();i++){  
  17.                         for(int start=0,end=s1.length()-i;end!=s1.length()+1;start++,end++){
  18.                                 String temp=s1.substring(start,end);
  19.                                 if(s2.contains(temp)){
  20.                                         //System.out.println(temp);
  21.                                         xs=s1.substring(0,start)+""+s1.substring(end,s1.length());
  22.                                         //System.out.println(xs);
  23.                                         break flag;
  24.                                 }

  25.                         }
  26.                 }
  27.                 return xs;
  28.         }

  29.         public static void StringCount(String str){
  30.         
  31.                 char []a=str.toCharArray();
  32.                 Map<Character,Integer> map=new HashMap<Character,Integer>();
  33.                 for(int i=0;i<a.length;i++){
  34.                         if(a[i]>'a'&&a[i]<'z'||a[i]>'A'&&a[i]<'Z'){
  35.                                 if(map.containsKey(a[i])){
  36.                                         int temp=map.get(a[i]);
  37.                                         temp+=1;
  38.                                         map.put(a[i],temp);
  39.                                 }else{
  40.                                         map.put(a[i],1);
  41.                                 }
  42.                         }
  43.                 }
  44.                

  45.                 StringBuilder sb=new StringBuilder();
  46.                 //这一块想实现排序,可是我又理解Map.Entry<String,Integer>不是很深刻,所以处理起来有问题了
  47.                 //下面这段被我注释的代码有问题,求高手指点,那里修改后,就可以正常输出排序后的结果
  48.                 /*List<Map.Entry<String,Integer>> list=new ArrayList<Map.Entry<String,Integer>>();
  49.                 list.addAll(map.entrySet());
  50.                 Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
  51.                   public int compare(Map.Entry<String,Integer> o1,Map.Entry<String,Interger> o2){
  52.                         return o1.getValue()-o2.getValue();
  53.                   }
  54.                 });
  55.                 System.out.println(list);
  56.                 */
  57.                
  58.                 Set<Map.Entry<Character,Integer>> entryset=map.entrySet();
  59.                 Iterator<Map.Entry<Character,Integer>> it=entryset.iterator();
  60.                 while(it.hasNext()){
  61.                         Map.Entry<Character,Integer>ch=it.next();
  62.                         Character key=ch.getKey();
  63.                         Integer value=ch.getValue();
  64.                         sb.append(key+"("+value+")");
  65.                 }
  66.                 System.out.println(sb);
  67.         }
  68. }
复制代码
自己写了2个小时多,就能写到现在这样,就是想实现
f(出现6次)d(出现5次)s(出现4次)x(出现2次)v(出现2次)c(出现2次)w(出现1次)g(出现1次)
这样一个顺序,就是在对里面value进行排序的时候有点疑惑,就是处理不好Comparator等一些排序的问题。感觉是不是逻辑思路有问题?重点问题是注释的代码,其他地方我明白

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

12 个回复

正序浏览
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
梁航斌 发表于 2013-4-18 18:29
写得有点乱,怕你看不懂,注释也没加,现在头都还有点痛

注意休息
回复 使用道具 举报
gerenvip 发表于 2013-4-18 21:57
其实楼主想实现的就是按照值来排序,而非键来排序。由于TreeMap只能对key进行排序,所以要想实现按值排序, ...

非常感谢
回复 使用道具 举报
本帖最后由 gerenvip 于 2013-4-18 22:02 编辑

其实楼主想实现的就是按照值来排序,而非键来排序。由于TreeMap只能对key进行排序,所以要想实现按值排序,需要转换思维。不得不说,楼主的思维方法很不错。
程序有点乱,尤其是注释后边的一点,也可以看出的确如楼主所说,楼主在Map.Entry<String,Integer>这方面的知识上掌握的不是多牢固。我试着修改了一下你的程序。
希望能对你有所帮助。
  1. import java.util.*;
  2. public class Test14
  3. {
  4.         public static void main(String []args){
  5.         String str=StringTool.containString("ahellodsaf");
  6.         System.out.println(str);
  7.         StringTool.StringCount(str);
  8.         }

  9. }
  10. class  StringTool
  11. {
  12.                 public static String containString(String s2){
  13.                 String s1="sdfg,hellozx,sdfcv-waadfa,fsasdfxcvdf";
  14.                 String xs=null;
  15.                 flag:
  16.                 for(int i=0;i<s1.length();i++){  
  17.                         for(int start=0,end=s1.length()-i;end!=s1.length()+1;start++,end++){
  18.                                 String temp=s1.substring(start,end);
  19.                                 if(s2.contains(temp)){
  20.                                         //System.out.println(temp);
  21.                                         xs=s1.substring(0,start)+""+s1.substring(end,s1.length());
  22.                                         //System.out.println(xs);
  23.                                         break flag;
  24.                                 }
  25.                         }
  26.                 }
  27.                 return xs;
  28.         }

  29.         public static void StringCount(String str){
  30.         
  31.                 char []a=str.toCharArray();
  32.                 Map<Character,Integer> map=new TreeMap<Character,Integer>();
  33.                 for(int i=0;i<a.length;i++){
  34.                         if(a[i]>'a'&&a[i]<'z'||a[i]>'A'&&a[i]<'Z'){
  35.                                 if(map.containsKey(a[i])){
  36.                                         int temp=map.get(a[i]);
  37.                                         temp+=1;
  38.                                         map.put(a[i],temp);
  39.                                 }else{
  40.                                         map.put(a[i],1);
  41.                                 }
  42.                         }
  43.                 }
  44.                  //*************************************************************
  45.                 //一下是按照楼主的思路修改的。
  46.                                 Set<Map.Entry<Character,Integer>> me = map.entrySet();

  47.                 StringBuilder sb=new StringBuilder();
  48.    
  49.                 List<Map.Entry<Character,Integer>> list=new ArrayList<Map.Entry<Character,Integer>>();
  50.                 list.addAll(me);
  51.                 Collections.sort(list,new MyComparator());//匿名内部类太乱,最起码我看着不爽,所以我把比较器拿出来
  52.                                 //单独封装成了类MyComparator,作用是实现按照值来排序

  53.                 System.out.println(list);//输出按值比较后的list列表
  54.                
  55.                 Iterator<Map.Entry<Character,Integer>> it=list.iterator();
  56.                 while(it.hasNext()){
  57.                         Map.Entry<Character,Integer>ch=it.next();
  58.                         Character key=ch.getKey();
  59.                         Integer value=ch.getValue();
  60.                         sb.append(key+"("+value+")");
  61.                 }
  62.                 System.out.println(sb);
  63.         }
  64. }
  65. class MyComparator implements Comparator<Map.Entry<Character,Integer>>
  66. {
  67.         public int compare(Map.Entry<Character,Integer> me1,Map.Entry<Character,Integer> me2)
  68.         {
  69.                 //按值来比较,me2放前面,按照从大到小排列
  70.                 int num = new Integer(me2.getValue()).compareTo(new Integer(me1.getValue()));
  71.                 if(num==0)
  72.                         return me2.getKey().compareTo(me1.getKey());//当值相同时,按键比较
  73.                 return num;               
  74.         }
  75. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
  1. List<Map.Entry<Character,Integer>> list=new ArrayList<Map.Entry<Character,Integer>>(entryset);//把关系类放到List集合中。
复制代码
给你个例子看看就懂了。
  1. import java.util.*;
  2. class  TreeMapDemo
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

  7.                         tm.put('a', 1);
  8.                         tm.put('c', 3);
  9.                         tm.put('y', 6);
  10.                         tm.put('f', 3);
  11.                        
  12.                         Set<Map.Entry<Character,Integer>> entryset = tm.entrySet();

  13.                         List<Map.Entry<Character,Integer>> enlist = new ArrayList<Map.Entry<Character,Integer>>(entryset);//注意这里

  14.                         Collections.sort(enlist,new IntegerDemo());   //Collections.sort是用在List集合中的。


  15.                         Iterator<Map.Entry<Character,Integer>> it = enlist.iterator();
  16.                        
  17.                         while(it.hasNext())
  18.                         {
  19.                                 Map.Entry<Character,Integer> me = it.next();
  20.                                 Character c = me.getKey();
  21.                                 Integer i = me.getValue();
  22.                                 System.out.println(c+":"+i);
  23.                         }

  24.                        
  25.         }
  26. }

  27. class IntegerDemo implements Comparator<Map.Entry<Character,Integer>>
  28. {
  29.         public int compare(Map.Entry<Character,Integer> c1,Map.Entry<Character,Integer> c2)
  30.         {
  31.                 return  c2.getValue().compareTo(c1.getValue());       
  32.                
  33.         }
  34. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
滔哥 + 2

查看全部评分

回复 使用道具 举报
ゞSunペ果果つ 发表于 2013-4-18 18:18
一到难一些的问题就很少人回复了,哥们,我们一起努力吧,

写得有点乱,怕你看不懂,注释也没加,现在头都还有点痛
回复 使用道具 举报
Miss小强 发表于 2013-4-18 14:04
map集合的排序,Map有一个子类:TreeMap;可以实现排序。希望能帮到你。。。 ...


那个还足够排这个。不过那个是可以排序,要重写函数
回复 使用道具 举报
梁航斌 发表于 2013-4-18 17:56
终于写完了,昨天生病了,没来得及写完也就不注释了

一到难一些的问题就很少人回复了,哥们,我们一起努力吧,
回复 使用道具 举报
终于写完了,昨天生病了,没来得及写完
  1. import java.io.*;
  2. import java.util.*;
  3. class dayDemo
  4. {
  5.         public static String str1 = "sdfg,hellozx,sdfcv-waadfa,fsasdfxcvdf";
  6.         public static StringBuilder sb = new StringBuilder(str1);
  7.         public static void main(String []args) throws Exception{
  8.                         String str2 = input();
  9.                         String maxlenword = getMaxWord(sb,str2);
  10.                         String fixstr1 = delStr(sb,maxlenword);
  11.                         countChar(fixstr1);
  12.         }
  13.         public static String input() throws Exception{
  14.                 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  15.                 String str2 = br.readLine();
  16.                 br.close();
  17.                 return str2;
  18.         }
  19.         public static String getMaxWord(StringBuilder s1,String s2){
  20.                 ArrayList<String> list=new ArrayList<String>();
  21.                 for(int i=0;i<s1.length();i++){
  22.                         for(int j=i+2;j<=s1.length();j++){
  23.                                    String str=s1.substring(i,j);
  24.                                 if(s2.indexOf(str)!=-1){
  25.                                         list.add(str);
  26.                                 }
  27.                         }
  28.                 }
  29.                 int maxlen = 0;
  30.                 int maxlenword =0;
  31.                 for(int i=0;i<list.size();i++){
  32.                         if(maxlen<list.get(i).length()){
  33.                                 maxlen = list.get(i).length();
  34.                                 maxlenword = i;
  35.                         }
  36.                 }
  37.                 return list.get(maxlenword);
  38.         }
  39.         public static String delStr(StringBuilder str1,String maxlenword){
  40.                 int pos = 0;
  41.                 while(sb.toString().contains(maxlenword)){
  42.                         pos = sb.toString().indexOf(maxlenword);
  43.                         sb.delete(pos,maxlenword.length()+pos);
  44.                 }
  45.                 return sb.toString();
  46.         }
  47.         public static void countChar(String fixstr1){
  48.                 char []c = fixstr1.toCharArray();
  49.                 TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
  50.                 for(int i=0;i<c.length;i++){
  51.                         int count = 1;
  52.                         for(int j=0;j<c.length;j++){
  53.                                 if(c[i]==c[j]&&(c[i]>'A'&&c[i]<'z')){
  54.                                         tm.put(c[i],count++);
  55.                                 }
  56.                         }
  57.                 }
  58.                 List<Map.Entry<Character,Integer>> entryLists = new ArrayList<Map.Entry<Character,Integer>>(tm.entrySet());
  59.                 Collections.sort(entryLists, new EntryComparator());
  60.                 for(Map.Entry<Character, Integer> entry : entryLists) {
  61.                 System.out.print(entry.getKey()+"(出现" + entry.getValue()+"次)");
  62.            }
  63.         }
  64. }
  65. class EntryComparator implements Comparator<Map.Entry<Character, Integer>>
  66. {
  67.         public int compare(Map.Entry<Character, Integer> map1,Map.Entry<Character, Integer> map2){
  68.                 int num = map2.getValue() - map1.getValue();
  69.                 if(num==0)
  70.                         return map2.getKey().toString().compareTo(map1.getKey().toString());
  71.                 return map2.getValue() - map1.getValue();
  72.         }
  73. }
复制代码
也就不注释了

评分

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

查看全部评分

回复 使用道具 举报
我现在考虑用HashMap,通过HashCode试着解决
回复 使用道具 举报
梁航斌 发表于 2013-4-18 13:58
感觉和你的差不多,我也是想到用map,也是卡在采用map排序的问题上。

map集合的排序,Map有一个子类:TreeMap;可以实现排序。希望能帮到你。。。
回复 使用道具 举报
感觉和你的差不多,我也是想到用map,也是卡在采用map排序的问题上。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马