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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-唐磊 中级黑马   /  2012-5-21 10:49  /  3077 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个文本文件,记录了某个学校所有人的姓名、出生日期(假设没有人重名,该校大约有2万人)。记录格式如下:
。。。。。。
张三 19800120
李四 19810321
王五 19800122
赵六 19830321
。。。。。。
现在需要在某天举办一场生日晚会,邀请生日在当天的人员参加。如果期望这场生日晚会参加的人员尽可能多,那么应该选择在哪一天?在解答时,需要注意代码的效率、质量。当不能给出完整代码时,可以描述解题思路。
我的思路是这样的,先用IO流读取这个文件,然后将其存入Map集合里,再将其所有的元素进行迭代,获取里面键所对应的值,因为生日相同所以不需要考虑其年份,就用subString截取年份以后的后4位,将这四位与其他元素进行比较,定义一个count计数器。如果有没有重复的值就获取并将其记录住,有重复得值就count++。获取不同值出现count的次数。在对count的次数进行比较获取count的最大值,再次将值与count次数的键值关系存入map集合里,最后打印出来。我做不出来主要是在判断重复元素和比较count大小这一环节卡住了,总是出现空指针异常,可能对迭代关系理解的不够透,因为在数组中判断重复元素就是两个for循环就搞定了,希望有大师能指点指点

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 冯越 于 2012-5-21 16:18 编辑

你的思路基本是没问题的。不过我建议你在前面提取生日后四位子串的时候,先用 正则表达式 提取整个生日字符串然后再用subString(int start, int end)提取后四位生日字符串。然后将其存入一个String[]中。
然后这是我给你写的核心代码,就是在你提取过字符串之后应该做的。
public class Birthday {        
        public static void birthday(String[] birthdays) {
                Map<String, Integer> map = new HashMap<String, Integer>();
                for(String birthday : birthdays) {
                        if(map.get(birthday) == null) {   //这里判断此生日是否在Map中重复
                                map.put(birthday, 1);       //没有重复就把他存入Map,然后value值取1
                        } else {          //如果重复
                                int value = map.get(birthday) + 1;  //把和这个日期对应的value值加1
                                map.put(birthday, value);  //把更新过之后的value值重新存入Map
                        }
                }
               
                Collection c = map.values();        //把values的值存储在一个集合中                int max = Collections.max(c);     //得到value集合中最大的value值 即次数的最大值
                Set<Map.Entry<String, Integer>> entrys = map.entrySet();
                System.out.print("重复次数最多的日期是:");
                for(Map.Entry<String, Integer> entry : entrys) {   //对set进行迭代
                        if(max == entry.getValue()) {          //如果set中元素的value值和最大次数值相等就把他所对应的key值 即日期值输出
                                System.out.print(entry.getKey() + "  ");     //这里会输出所符合条件的日期值
                        }
                }
               
        }        
        public static void main(String[] args) {
                birthday(args);      //这里我假设从参数列面来获取生日日期
        }
}

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
攻城狮 + 1 赞一个!
黑马-唐磊 + 5 赞一个!

查看全部评分

回复 使用道具 举报
搞了半天终于搞定了
途中也出了许多的空指针异常,都是马虎导致的。
  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.Map;
  4. import java.util.Set;




  5. public class test{
  6.   public static void main(String []args){
  7.           String []s={"19900801","19890801","19721230","19901010","19901010","19791010","19890801"};
  8.           HashMap<String,Object> hm=new HashMap<String,Object>();
  9.           int counter=1;
  10.           for(int i=0;i<s.length;i++){
  11.                   if(hm.put(s[i].substring(4), hm.get(s[i].substring(4)))!=null){
  12.           //                System.out.println(s[i].substring(4)+"--------------->"+hm.get(s[i].substring(4)));
  13.                           int temp=(Integer) hm.get(s[i].substring(4));
  14.                           hm.remove(s[i].substring(4));
  15.                           hm.put(s[i].substring(4), temp+1);
  16.                   }
  17.                   else
  18.                           hm.put(s[i].substring(4), counter);
  19.           }
  20.          
  21.           Set entries=hm.entrySet();
  22.           Iterator iter = entries.iterator();
  23.           while(iter.hasNext()){
  24.                   Map.Entry entry = (Map.Entry)iter.next();
  25.                   Object key = entry.getKey();
  26.                   Object value = entry.getValue();
  27.                   System.out.println(key+"--------------->"+value);
  28.           }
  29.           }
  30.    }
  31.    
复制代码
希望能有帮助

未命名.jpg (20.86 KB, 下载次数: 78)

未命名.jpg

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
攻城狮 + 1 赞一个!
黑马-唐磊 + 3 赞一个!

查看全部评分

回复 使用道具 举报
胥江 发表于 2012-5-21 13:26
搞了半天终于搞定了
途中也出了许多的空指针异常,都是马虎导致的。希望能有帮助 ...

我那个是要得到生日相同最多的一天,所以我只需要得到相同天数的最大值也就是value最大值,所以还需要判断,但做到这也就差不多出来了,还是很谢谢
回复 使用道具 举报
帮你全部搞定了 请注意查看 有问题再讨论
回复 使用道具 举报
冯越 发表于 2012-5-21 16:20
帮你全部搞定了 请注意查看 有问题再讨论

嗯,谢谢
回复 使用道具 举报
郭宁 中级黑马 2012-5-21 18:59:55
7#
  1. public class MaxBirthday {

  2.         /**
  3.          * @param args
  4.          *
  5.          * 我的思路是这样的,定义一张生日表 birthday_count【】【】
  6.          * 把两万大军的生日读一遍,每读到一个在相应的生日表中加 1
  7.          * 最后遍历一遍 找到 生日表中 人数最多的
  8.          *
  9.          */
  10.        
  11.         private static int[][] birthday_count = new int[13][32];//我是学C语言出来额,这里为什么定义【12】【31】时,下面访问就会出现越界?
  12.                                                                                                                         //java 的 数组和C的数组有什么不同的么? 求指导!!!
  13.         private static String[] birthdays = {"0203","0103","0203","0513","0203","1213","1111","1231"};
  14.        
  15.         public static void main(String[] args) {
  16.                 // TODO Auto-generated method stub
  17.                 int x = 0 ,y = 0 ;
  18.                 int temp=0;
  19.                 for(String birthday : birthdays)
  20.                 {
  21.                         x = Integer.valueOf(birthday.substring(0, 2));
  22.                         y = Integer.valueOf(birthday.substring(2, 4));
  23.                         birthday_count[x][y]++;//
  24.                 }
  25.                
  26.                 for(int m=0;m<12;m++)
  27.                 {
  28.                         for(int d=0; d<31; d++)
  29.                         {
  30.                                 if(temp<birthday_count[m][d])
  31.                                 {
  32.                                         temp = birthday_count[m][d];
  33.                                         x=m;y=d;
  34.                                 }
  35.                         }
  36.                 }
  37.                 System.out.println(x+"月"+y+"号生日的人最多》》共》》"+temp+"人");
  38.         }

  39. }
复制代码
回复 使用道具 举报
刘聪 中级黑马 2012-5-21 20:16:39
8#
郭宁 发表于 2012-5-21 18:59

我对c不熟,也就大学时研究过指针还是老师逼的,不过我看过一些对于c中数组与java数组的比较的介绍,个人感觉没有太大区别,究根究底还是指针与引用的问题。
你在定义[12][31]会出做我认为是你忘记了数组下标是从0开始的,而月与日是没有0这一说法的,而你是把取出的日期当做下标了,就会有下标[12]
  • 或者
  • [31]而这时定义的数组[12][31]就会越界。所以如果还要用int[12][31]的话,就需要在这里改动一下。
  • 回复 使用道具 举报
    郭宁 中级黑马 2012-5-21 20:19:32
    9#
    刘聪 发表于 2012-5-21 20:16
    我对c不熟,也就大学时研究过指针还是老师逼的,不过我看过一些对于c中数组与java数组的比较的介绍,个人 ...

    顿悟了~   谢啦! 放久了都不注意这事了!!
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 加入黑马