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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 一碗小米周 于 2013-10-26 15:39 编辑

在网上看到一个百度的算法题,如题,在一个数组中,找出出现次数最多且数值最大的一个数并输出。上次看视频的时候,突然想到可以通过map集合来做这题,将数值作为键存入map集合,而将出现的次数作为值存入map集合中。然后可以取出元素及元素出现的个数,那么请问各位怎么进行比较呢?取出那个出现次数最多且数值最大的元素。下面是我的代码,求高手指点一下啊。谢谢。
  1. package test;

  2. import java.util.*;

  3. /*查找一个数组中出现次数最多且最大的数。
  4. * int[] a={1,2,3,2,4,2,4,2}
  5. * */

  6. public class FindArray {
  7.         public static void main(String[] args) {
  8.                 int[] in ={2,4,3,2,4,2,3};
  9.                 findElement(in);
  10.         }
  11.         public static void findElement(int[] in){
  12.                 Map<Integer,Integer> map =new TreeMap<Integer,Integer>();
  13.                 for(int x = 0;x<in.length;x++){
  14.                         Integer value = map.get(in[x]);
  15.                         if(value==null){
  16.                           map.put(in[x],1);        
  17.                         }
  18.                         else
  19.                           map.put(in[x], ++value);
  20.                 }
  21.                 Set<Integer> set = map.keySet();
  22.                 Iterator<Integer> iterator = set.iterator();
  23.                 while(iterator.hasNext()){
  24.                         Integer key = iterator.next();
  25.                         int count = map.get(key);
  26.                         System.out.println(key+"出现了"+count+"次");
  27.                 }
  28.            
  29.         }
  30. }
复制代码

评分

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

查看全部评分

4 个回复

正序浏览
回复楼上,采用Map也实现了相同的功能,谢谢!
  1. static int[] aa = {1, 7, 2, 4 , 7, 3, 5, 6, 7, 9 , 2, 5, 3, 7, 9, 9, 9};
  2.         public static void main(String[] args) {
  3.                 Map<Integer, Integer> map = new HashMap<Integer, Integer>();
  4.                
  5.                 for (int i = 0; i < aa.length; i++) {
  6.                         if (map.get(aa[i]) == null) {
  7.                                 map.put(aa[i], 1);
  8.                         } else {
  9.                                 map.put(aa[i], map.get(aa[i]) + 1);
  10.                         }
  11.                 }
  12.                
  13.                 int count = Integer.MIN_VALUE;
  14.                 for (Integer k : map.keySet()) {
  15.                         if (map.get(k) > count) {
  16.                                 count = map.get(k);
  17.                         }
  18.                 }
  19.                
  20.                 for (Integer k : map.keySet()) {
  21.                         if (map.get(k) == count) {
  22.                                 System.out.println("values = " + k + "  count = " + count);               
  23.                         }
  24.                 }
  25.         }
复制代码
回复 使用道具 举报
2楼的数组4出现了5次,3也出现了5次,似乎只是输出了4的次数,但没有输出3的次数!来瞧瞧我的代码

  1. /*
  2. * 想法:我没有用map集合存储,而是定义了两个ArrayList集合分别存储数组元素和出现的次数
  3. *                 这样可以更好的用值获取键。
  4. *                 由于数组中不同元素可能出现相同的次数(比如4可能出现2次,3也出现2次)
  5. *                 所以可以利用ArrayList的索引来获取键和值,只要让两个ArrayList集合的索引相同就可以了!
  6. */
  7. import java.util.ArrayList;

  8. public class GetMaxCount {

  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub

  11.                 int[] arr = new int[] { 1, 4, 2, 2, 4, 6, 7, 8 };
  12.                 getMaxCount(arr);
  13.         }
  14.         private static void getMaxCount(int[] arr) {
  15.                 // 定义两个集合,一个存储键,一个存储值
  16.                 ArrayList<Integer> listKey = new ArrayList<Integer>();
  17.                 ArrayList<Integer> listValue = new ArrayList<Integer>();

  18.                 // 如果数组为空,返回
  19.                 if (arr == null)
  20.                         return;
  21.                 // 遍历arr数组,将数组元素和元素出现的次数分别存放在listKey和listvalue中
  22.                 int arrNum;
  23.                 int index;// 定义角标索引
  24.                 int value;// 定义listValue需要存储的值
  25.                 for (int i = 0; i < arr.length; i++) {
  26.                         arrNum = arr[i];
  27.                         if (listKey.contains(arrNum)) {

  28.                                 index = listKey.indexOf(arrNum);
  29.                                 value = listValue.get(index);
  30.                                 listValue.set(index, ++value);
  31.                         } else {

  32.                                 listKey.add(arrNum);
  33.                                 index = listKey.indexOf(arrNum);
  34.                                 value = 1;
  35.                                 listValue.add(index, value);
  36.                         }

  37.                 }
  38.                 //取出所有元素
  39.                         System.out.println(listKey+"分别出现了"+listValue+"次");
  40.                        
  41.                 // 遍历listValue,找出最大值
  42.                 System.out.println();
  43.                 System.out.println("元素中最大次数。。。。");
  44.                 int maxValue = 0;
  45.                 for (int i = 0; i < listValue.size(); i++) {
  46.                         value = listValue.get(i);
  47.                         maxValue = maxValue > value ? maxValue : value;
  48.                 }

  49.                 // 再次遍历listValue,找出与listKey对应的键
  50.                 for (int i = 0; i < listValue.size(); i++) {
  51.                         value = listValue.get(i);
  52.                         if (maxValue == value) {
  53.                                 System.out.println(listKey.get(i) + "出现了" + maxValue +"次");
  54.                         }
  55.                 }

  56.         }

  57. }
复制代码
回复 使用道具 举报
wenbaoxing 发表于 2013-10-26 12:38
请看我的代码,我有注释:

非常感谢。。
回复 使用道具 举报
请看我的代码,我有注释:


  1. import java.util.*;

  2. /*查找一个数组中出现次数最多且最大的数。
  3. * int[] a={1,2,3,2,4,2,4,2}
  4. * */

  5. public class TestFindArray {
  6.         public static void main(String[] args) {
  7.                 int[] in ={2,4,3,2,4,4,4,2,4,3,3,3,3};
  8.                 findElement2(in);
  9.         }
  10.         public static void findElement(int[] in){
  11.                 Map<Integer,Integer> map =new TreeMap<Integer,Integer>();
  12.                 for(int x = 0;x<in.length;x++){
  13.                         Integer value = map.get(in[x]);
  14.                         if(value==null){
  15.                           map.put(in[x],1);        
  16.                         }
  17.                         else
  18.                           map.put(in[x], ++value);
  19.                 }
  20.                 Set<Integer> set = map.keySet();
  21.                 Iterator<Integer> iterator = set.iterator();
  22.                 while(iterator.hasNext()){
  23.                         Integer key = iterator.next();
  24.                         int count = map.get(key);
  25.                         System.out.println(key+"出现了"+count+"次");
  26.                 }
  27.            
  28.         }

  29.                 /*
  30.                 需求:取出整型数组中那个出现次数最多且数值最大的元素

  31.                 思路:
  32.                 1、创建一个map集合
  33.                 2、将int数组中的元素逐个添加进Map集合中,key存储元素,value存储次数,在添加过程中如果元素已经存在,则将该元素对应的value值自增后再存入
  34.                 3、遍历集合取出出现次数最多,且数值最大的元素

  35.                 */
  36.                 public static void findElement2(int[] arr){
  37.                         Map<Integer,Integer> map=new LinkedHashMap<Integer,Integer>();

  38.                         //逐个将数组中的元素添加进集合中
  39.                         for (int i=0;i<arr.length ;i++ )
  40.                         {
  41.                                 Integer value=map.get(arr[i]);
  42.                                 if (value!=null)
  43.                                 {
  44.                                         map.put(arr[i],++value);
  45.                                 }
  46.                                 else
  47.                                         map.put(arr[i],1);
  48.                         }

  49.                         //遍历map集合,同时记录符合条件的key和value
  50.                         Integer keyMax=(Integer)arr[0];
  51.                         Integer valueMax=(Integer)map.get(arr[0]);

  52.                         //我用entrySet方式遍历的
  53.                         for (Object obj:map.entrySet() )
  54.                         {
  55.                                 Map.Entry me=(Map.Entry)obj;
  56.                                 Integer key=(Integer)me.getKey();
  57.                                 Integer value=(Integer)me.getValue();
  58.                                 System.out.println(key+":"+value);
  59.                                
  60.                                 //获取次数最多的元素及其出现次数记录下来,如果value相等再比较key值的大小,取出key值大的记录下来
  61.                                 if (value>valueMax)
  62.                                 {
  63.                                         valueMax=value;
  64.                                         keyMax=key;
  65.                                 }else if (value==valueMax)
  66.                                 {
  67.                                         if (key>keyMax)
  68.                                         {
  69.                                                 keyMax=key;
  70.                                         }
  71.                                 }
  72.                         }

  73.                         System.out.println("出现次数最多的元素以及出现的次数为:");
  74.                         System.out.println(keyMax+":"+valueMax);



  75.                                
  76.                
  77.                 }
  78. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马