zoukankan      html  css  js  c++  java
  • 对 Java 集合的巧妙利用

    对 Java 集合的巧妙利用

     

      我们直接切入正题。首先大致介绍一下 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 保证自然顺序

    作者:KeerDi —— 北方的后生

    出处:http://www.cnblogs.com/keerdi/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    HTML基础 meta refresh 网页定时刷新
    HTML基础 meta name author 添加网页作者的信息
    HTML基础 mate refresh 5秒钟后,页面自动跳转
    HTML基础 marquee div块实现循环跑马灯的效果
    微服务jar包启动脚本
    怎么实现将word中的公式导入(或粘贴)到在线编辑中
    怎么实现将word中的公式导入(或粘贴)到网页编辑中
    Nginx实现浏览器端大文件分块上传
    javascript实现浏览器端大文件分块上传
    js实现浏览器端大文件分块上传
  • 原文地址:https://www.cnblogs.com/123hll/p/6903344.html
Copyright © 2011-2022 走看看