对 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 保证自然顺序

转载于:https://www.cnblogs.com/123hll/p/6903344.html

对 Java 集合的巧妙利用相关推荐

  1. java集合源码分析

    List,Set,Map都是接口,前两个继承Collection接口,Map为独立接口 Set的实现由HashSet,LinkedHashSet,TreeSet List下有ArrayList,Vec ...

  2. 利用java集合框架实现扑克牌比大小游戏

    程序实现前提: 1.了解java集合框架 2.Collections工具类 3.Comparable,Comparator接口 游戏要求: 游戏有两个玩家,分别会得到两张纸牌,然后进行比较大小,拿到纸 ...

  3. java集合系列之18 spring boot程序员的必修课

    Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人的博客的访问量大幅增加就可以感受到大家对学习 Spring Boot 的热情,那么在这么多人热衷于学习 ...

  4. Java集合排序及java集合类详解

    Java集合排序及java集合类详解 (Collection, List, Set, Map) 摘要内容 集合是Java里面最常用的,也是最重要的一部分.能够用好集合和理解好集合对于做Java程序的开 ...

  5. 史上最全的集合框架讲解 ----- Java 集合框架(3)---- Map 相关类最全解析

    引言 好了,步入正题,上篇文章Java 集合框架(2)---- List 相关类解析中我们一起看了一下 List 接口的相关具体类(ArrayList.LinkedList-.),这篇开始我们开始探索 ...

  6. Java集合包含面试题

    Java集合 Java 所有的集合类都位于 java.util 包下 集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保 ...

  7. Java 集合框架系列,总结性全文,解决你所有困惑

    文章目录 集合接口 Collection Map 集合实现类 抽象类实现 通用实现 遗留实现 并发实现 特殊实现 适配器实现 包装器实现 便利实现 基础设施 算法和工具实现 定长/变长 可改/不可改 ...

  8. 问遍了身边的面试官朋友,我整理出这份 Java 集合高频面试题(2022年最新版)

    微信搜索[程序员囧辉],关注这个坚持分享技术干货的程序员. 我的最新文章:百万级QPS,支撑淘宝双11商品浏览需要哪些技术 前言 大家好,我是囧辉,面试系列开篇:Java 基础高频面试题(2021年最 ...

  9. java集合总结_Java中集合总结

    Java数组的长度是固定的,为了使程序能够方便地存储和操作数目不固定的一组数据,JDK类库提供了Java集合,这些集合类都位于java.util包中,但是与数组不同的是,集合中不能存放基本类型数据,而 ...

最新文章

  1. stream map方法_Java Stream中map和flatMap方法
  2. (21)页目录表,页表基址(XP系统 10-10-12分页模式)
  3. WCF热带鱼书学习手记 - Service Contract Overload
  4. linux+eth0+流量监控,linux流量监控脚本 | 旺旺知识库
  5. OPCDA通信--工作在透明模式下的CISCO ASA 5506-X防火墙配置
  6. .net解析传过来的xml_隧桥管廊BIM+GIS运维管理系统方案解析
  7. mysql主从复制-主库已有数据
  8. spring boot + swagger2
  9. 名字作诗,增添你的印象分
  10. 硬件和软件的32位与64位区别
  11. Hive误删除后,如何恢复数据
  12. java中poi搜索工程_爬取高德地图poi数据
  13. flutter学习笔记--传递信息
  14. 解决html5直播延迟大问题,SRS 直播系统使用中发现延迟过大
  15. uber奖励和账单详解
  16. 华硕h110m主板怎么样_华硕台式机主板怎么样 华硕台式机主板多少钱【详细介绍】...
  17. 基于射频RFID智能刷卡门禁系统设计(毕设课设)
  18. 人体姿态估计——PBN
  19. AD7799称重系统
  20. 抖音提取封面php,抖音解析php API现在能解析出图片视频不行了

热门文章

  1. AttributeError: module 'tensorflow' has no attribute 'sub'
  2. jvm内置锁synchronized不能被中断
  3. centos6系列版本防火墙图形化设置
  4. [BZOJ1097][POI2007]旅游景点atr
  5. ZED 相机 ORB-SLAM2安装环境配置与ROS下的调试
  6. ThinkPHP集成万象优图
  7. 内存管理之slab分配器
  8. Unity3D Editor 扩展
  9. (032) Linux之shell流控制for循环
  10. Android 4.1最终版SDK和ADT Plugin全线发布