1

java笔记08 集合(含大量习题)

 2 years ago
source link: https://blog.csdn.net/weixin_52618349/article/details/123040756
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

java笔记08 集合(含大量习题)

抹茶味的西瓜汁 于 2022-02-21 23:01:54 发布 239
专栏收录该内容
10 篇文章 0 订阅

这一章节是我们java中最重要的一章(没有之一)。以后的学习几乎离不开集合的使用。所以这一章我们的习题和之前面向对象oop一样,有大量的习题,非常非常多。

LinkedList 有序  元素可以重复 元素可以为空
ArrayList和LinkedList区别
1.数据结构不同   ArrayList实现了动态的数组   LinkedList实现的链表
2.效率不同 
访问元素的时候 ArrayList要比LinkedList效率高 (因为ArrayList是数组形式 存储 LinkedList是链表形式 链表形式  需要利用指针来操作数据)查询
如果要对数据进行增加和删除的操作LinkedList比ArrayList效率高
3.自由行不同 ArrayList自由行比较低  LinkedList自由行比较高
4.主要控件开销不同
Set 接口 散列表的数据结构 
散列码 一个关键字的信息被用来确定唯一的值  散列码是用来与关键字相连接的存储下标
HashSet 是Set接口的实现类   哈希表 综合了数组和链表的优点 
Set特点
(1)有序无序 无序 
(2)是否可以重复 不可以
(3)是否可以为空 可以

Map 散列映射    key-----value  键值对 
HashMap实现 Map 继承 AbstractMap 
get() 获取   put(“key”,“value”)输入   key不允许重复  value可以重复
迭代器  
无序  key不可以重复  value可以重复   key不可以为空  value可以为空
getKey()获取key   getValue()获取value值 

Map  键值对    key  value  所有的key不能重复   
map 无序  key不能重复  value可以    key不能为空  value 可以为空
(1)put(key,value) 向集合中添加映射关系  
(2)get(key)key作为get方法的参数进行传递  获取该key对应的value
(3)size()返回 集合中键值对映射的个数 
(4)boolean containsKey(key) 判断key是否包含在集合中
(5)boolean containsValue(value)判断 value是否包含在集合中  
(6)   Set entrySet() 返回映射中包含映射关系的set视图(entrySet()获取HashMap
的键值对 将键值对放入Set集合 然后同过迭代器遍历集合 )
(7)ketSet() 把所有key放入到一个Set集合中
(8)remove()删除 指定的映射关系
(9)boolean isEmpty() 判断集合是否为空 
(10) ArrayList values()获取集合中所有的value值 并把他们放入到集合中 ArrayList
HashMap的遍历方式
迭代器  Iterator
(1)iterator() 创建迭代器的方法   集合类对象.iterator() 
(2)next()返回序列的第一个元素  以后再次调用 会返回序列中的下一个元素
(3)hasNext() 判断 集合中是否还有元素
(4)remove() 将迭代器返回的元素删除
1.迭代器遍历
2.遍历HashMap的key
3.遍历HashMap的value
各种集合的区别
(1)Collection 接口存储一组不唯一 无序的对象  可以为空
(2)List 接口存储 不唯一 有序(根据插入顺序) 可以为空的对象
(3)Set 接口存储  唯一 无序 可以为空的对象
(4)Map 存储键值对 不能含有重复的键(value可以重复) 无序 可以为空(值可以为空)

这个题是比较难的一个题,因为它用到了一个我们很少会使用的知识点,TreeSet,它是一个可以用于排序的集合。我们先创建一个长度为20的数组。实例化TreeSet对象,并利用泛型把数组传进去,这里面调用了两个方法,一个是消除数据完全相同的两个数组元素,一个是消除id相同的情况,并且用成绩差作为排序的条件(默认升序),最后进行set集合值的添加和遍历。

这题是练习我们很少使用的LinkedList,练习LinkedList的三种插入方式,以及删除元素的方法。

这个题主要体现了ArrayList和我们普通数组的区别,list不需要事先定义长度,长度是可变的,相比于普通的数组,具有优势。

我们这个习题做的是从一副完整的扑克牌中随机抽取一张牌。这个题是很有难度的,因为它同时使用了ArrayList和HashSet。我们先是利用双重for循环给每个花色匹配数字。然后把对应的牌存到list中,再从list中根据下标随机抽取一张牌存入set中,最后打印set就可以了。主要必须要事先在类中写好toString方法。因为list的本质也是基于数组的,所以我们可以像数组那样通过下标获取对应的元素。

这个习题是一个针对知识点的综合运用,首先是我们使用了像ArrayList中传值,然后用到了contains方法判断某值是否存在,并且也是用到了之前学过的自定义异常类。输出自定义异常。

这个题也是学习的是利用Comparator对ArrayList进行排序输出,这里是按照年龄升序排列。

这是一种比较通用的对ArrayList排序的方法,以后遇到这种情景可以直接拿来使用。

这个题实际上是对于之前提到过的内部类的一个应用,我们在一个外部类的内部又定义了一个内部类,然后在内部类中定义属性,以及有参,无参构造方法,set,get方法,toString方法。我们还在内部类中定义了一个Set散列,将当前的内部类的对象传进散列中,最终输出该散列。

这个习题,我们利用集合去做一个斗地主随机发牌系统:

 这个题是非常难的一个题,它有一定的业务逻辑,并且它用到了ArrayList,HashMap,以及所有集合的父类Collections,非常考察大家对集合的掌握程度。

它的思路是我们先实例化一个HashMap用于存储已经组装好的牌,然后定义三个ArrayList分别存储牌的编号index,牌的花色,拍的数字。

在存储数字时用到了Collections.addAll()方法,这个方法是用于将所有指定的元素添加到指定的集合中。这样对于要传递大量数据时就不用一个一个的add了。

由于没有办法去用花色和数字的组合去表示大王和小王,所以就单独先把大王小王存放到HashMap中,并把他们的编号存储到Index数列中。编号采用初始值为0,然后index++的方式进行递增。大王小王存储后,我们开始利用双重for循环存储其他的牌,编号递增存储到Map里作为key,同时也存储到Index数列中,Map的value值也就是牌用字符串拼接的方式,把花色和数字拼接到一起,同时编号index仍然++自增。我们做好了扑克牌后就开始洗牌,对于打乱编号数列的顺序我们使用了Collections.shuffle方法把编号数列中的元素顺序打乱。这样扑克牌就不是按顺序存放的了。我们随机取到的编号不是连续的。

然后我们又定义了4个ArrayList分别代表三个玩家和一个底牌。

我们按照编号遍历,从编号数列中随机获取编号,最后三张牌作为底牌,并根据除3的余数分发给对应的人,每个人最后得到的牌数量一定是相同的。然后根据我们手中牌的编号利用Collections.sort方法进行升序排列。我们最后只需要根据我们手中的编号作为HashMap的key值获取对应的value值也就是手中的扑克牌了.

这个题比较复杂,所以我详细的解释了一番,怕大家看不懂,这个题属于对于集合的综合使用,是一个非常全面的题,这个题大家理解了,对于List以及map就理解的差不多了。

这个题是属于拓展了一下,我们可以用Properties类去存放key,value值。然后把key值(字符串类型)以stringPropertyNames方法返回给set散列,set散列可以通过properties的getProperty方法获取Key值打印出对应的value值,和hashmap直接使用keySet的效果是一样的。

这道题是从一副完整的扑克牌中随机抽取三张牌并展示出来:

这个题和之前的17题做法类似,并且没有17题难,这里就不做解释了,17题会了,这题就会了,以这题收尾是因为这题同时练习了ArrayList,HashMap,HashSet,把集合中常用的涉及的比较全面了。

我们这部分练习题就这19道。

集合这部分才真正的有点显示出java后端的功能和魅力,可以做一些有一点点逻辑的后端的东西。

这部分我学习的时候,还做了两个小小的项目,这两个小项目分享给大家,其实都不能算项目,但是是对集合进行一个真正的实际开发的应用。这两个小项目彻底明白,集合这个章节也就过关了。

项目例1:

学生管理系统:

这里是有点Bug的,我们这里添加如果是key相同,其实也就是修改功能了。

例2:图书管理系统:

我们这个也是存在一个bug,就是我们的图书是我们想添加什么就有什么,我们真正做项目,是把数据存放到数据库当中去的。我们这里没有使用数据库。所以我们现在只是利用集合做两个这样的伪项目,它没有前端,也没有数据库。但是我们可以看到一些基本的业务比如增删改查,我们是可以做到的。这里对后面做项目是起到一个过渡的过程。也是和以往java基础中解决单一问题有一些区别。重要性不言而喻。

这些题都滚瓜烂熟,集合也就能够很好的掌握了。 

文章知识点与官方知识档案匹配,可进一步学习相关知识

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK