这道题目非常常见,一拿到手,首先想到的就是有序和无序,如果是无序,可以先转化为有序,但仔细一想,发现这样不对啊!就算排完序,还是得一个一个比较,然后统计不重复的数字的个数!干脆一开始就比较算了。。。
所以我们可以这样解:
public static void search(int[] array) { int len = array.length; for (int i = 0; i < len; i++) { if (list.indexOf(array[i]) == -1) { list.add(array[i]); map.put(array[i], 1); } else { int num = map.get(array[i]) + 1; map.put(array[i], num); } } Set keys = map.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { Integer key = (Integer) iterator.next(); System.out.println(key + "出现的次数: " + map.get(key)); } }
既然是统计不重复的数字的个数,使用Map比较好,但如何知道Map的Key值到底有没有重复呢?这里我用一个List的IndexOf()方法来确保Key值不是重复的。
但问题来了:我们新建一个List来存储元素,就是为了调用它的一个方法:IndexOf(),这样好吗?
答案当然是不好的!效率非常低,但Map到底有没有方法来确保它的Key值是唯一的呢?本来Map的实现就是无论如何Key都是唯一的,但我们的重点就是如何修改Key的Value值,前面还得判断该Key是否已在Map的KeySet中?
有一种利用异常的方法:
public static void search(int[] array) { int len = array.length; int num = 0; for (int i = 0; i < len; i++) { try { num = map.get(array[i]); } catch (Exception e) { map.put(array[i], 1); continue; } map.put(array[i], num + 1); } Set keys = map.keySet(); Iterator iterator = keys.iterator(); while (iterator.hasNext()) { Integer key = (Integer) iterator.next(); System.out.println(key + "出现的次数: " + map.get(key)); } }
利用NullPointException来确定是否有该Key。
当然,我们可以遍历KeySet来确定是否有该Key,但每一次都要这么搞吗?这不是和List的做法是一样的?
有没有更好的想法呢?基于Map的Key-Value机制上来确认Key值是否已经存在,前提是不需要遍历KeySet?
跪求大神指导。。。