我们直接切入正题。首先大致介绍一下 Java 三大集合的一些特征:
①、ArrayList:底层采用数组结构,里面添加的元素有序可以重复。
②、HashSet:底层采用哈希表算法,里面添加的元素无序不可重复。
③、HashMap:底层也是采用哈希表算法,但是里面添加的元素是 key-value 的形式。key 不允许重复,value 可以。
那么我们在日常编程中就可以好好利用这些集合的原理,简化我们的编程思路。
一、如何统计一字符串中每个字符出现的次数?
解析:给定一串字符串,统计每个字符出现的次数。那么最后统计出来的格式应该如下:
a---num个
b---num个
...
j---num个等等
很明显,这种格式首先第一个统计的字符是不能重复的,而出现的个数我们可以不用管。那么很容易联想到 Map 的集合原理,key-value。我们将统计的字符放在 Map<Character,Integer>中是一种很好的实现方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class CountCharTest { public static Map<Character, Integer> countChar(Map<Character, Integer> map,String str){ //将所给的字符串解析为一个字符构造的数组 char [] chars = str.toCharArray(); for ( char c : chars){ if (map.containsKey(c)){ int oldCount = map.get(c); map.put(c, oldCount+ 1 ); } else { map.put(c, 1 ); } } return map; } public static void main(String[] args) { String str = "afoiasfoffqefljflsda" ; //定义一个 Map 集合,用来存放统计的 字符--个数 Map<Character, Integer> hashMap = new HashMap<>(); System.out.println(countChar(hashMap,str)); //{f=6, d=1, e=1, s=2, q=1, a=3, o=2, l=2, j=1, i=1} } } |
补充:这里我们用来保存统计字符的是 HashMap 的实现类,这里打印出来的字符统计是无序的。如果我们想根据字符串给定的顺序有序的统计出来,可以使 LinkedHashMap
1 2 3 4 5 6 7 | public static void main(String[] args) { String str = "afoiasfoffqefljflsda" ; //定义一个 Map 集合,用来存放统计的 字符--个数 Map<Character, Integer> linkedHashMap = new LinkedHashMap<>(); System.out.println(countChar(linkedHashMap,str)); //{a=3, f=6, o=2, i=1, s=2, q=1, e=1, l=2, j=1, d=1} } |
如果想用 uicode 的编码顺序打印给定的字符串,那么我们使用 TreeMap
1 2 3 4 5 6 7 | public static void main(String[] args) { String str = "afoiasfoffqefljflsda" ; //定义一个 Map 集合,用来存放统计的 字符--个数 Map<Character, Integer> treeMap = new TreeMap<>(); System.out.println(countChar(treeMap,str)); //{a=3, d=1, e=1, f=6, i=1, j=1, l=2, o=2, q=1, s=2} } |
二、给定一个数组,如何去掉重复的数据?
解析:这个联想到集合的特定,我们就很容易想到用 Set 集合来解决。将数组中的元素都放到Set,然后将 Set 集合转变为数组就可以了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class ClearRepeatTest { public static Integer[] clearRepeat( int [] array){ Set<Integer> set = new HashSet<>(); for ( int i : array){ set.add(i); } Integer[] newArray = set.toArray( new Integer[set.size()]); return newArray; } public static void main(String[] args) { //创建一个数组,可以看出 2和4 是重复的 int [] array = { 1 , 2 , 3 , 4 , 8 , 2 , 5 , 4 }; Integer[] newArray = clearRepeat(array); for (Integer i : newArray){ System.out.println(i); } //1 2 3 4 5 8 } } |
补充:同理我们可以 改变 Set 集合的实现类,hashSet 是无序的,我们可以会用 LinkedHashSet 保证既定顺序;TreeSet 保证自然顺序