目录

个人博客
www.tothefor.com
蓝桥杯复习知识点汇总

介绍一些在竞赛中会用到的集合(容器),和使用方法。具体一些的用法可见《JAVA基础学习-集合》

而本文是快速介绍和一些基本用法。最主要的还是要知道有这些东西,比赛时针对不同的场景用不同的集合(容器)。因为我从C++转过来的,所以对C++里面的容器使用比较了解。而本文不仅会把JAVA中特有的集合介绍一下,还会把C++中的容器如何在JAVA中使用也介绍一下。因为,C++中的一些容器确实很好用而且用的还挺多,但在JAVA中却很少。

1.JAVA

ArrayList、LinkedList、HashSet、TreeSet、LinkedHashSet、TreeMap、HashMap、LinkedHashMap 可见《JAVA基础学习-集合》

Map.Entry

一个Java中类似于C++中的Pair的容器。Map.Entry是Map的一个内部接口。配合Map使用。

主要的三个方法。

  • K getKey():
  • V getValue():
  • V setValue(V value)

示例:

    public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);LinkedHashMap<String,Integer> lm = new LinkedHashMap<>();lm.put("C",3);lm.put("A",1);lm.put("B",2);lm.put("D",4);Set<Map.Entry<String, Integer>> ent = lm.entrySet();Iterator<Map.Entry<String, Integer>> it = ent.iterator();while(it.hasNext()){Map.Entry<String,Integer> mid = it.next();System.out.println(mid.getKey());System.out.println(mid.getValue());}}//输出
C
3
A
1
B
2
D
4
    public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);LinkedHashMap<String,Integer> lm = new LinkedHashMap<>();lm.put("C",3);lm.put("A",1);lm.put("B",2);lm.put("D",4);Set<Map.Entry<String, Integer>> ent = lm.entrySet();Iterator<Map.Entry<String, Integer>> it = ent.iterator();while(it.hasNext()){Map.Entry<String,Integer> mid = it.next();System.out.println(mid.getKey());System.out.println(mid.getValue());mid.setValue(23);}System.out.println("修改后:");Iterator<Map.Entry<String, Integer>> it2 = ent.iterator();while(it2.hasNext()){Map.Entry<String,Integer> mid = it2.next();System.out.println(mid.getKey());System.out.println(mid.getValue());}}//输出
C
3
A
1
B
2
D
4
修改后:
C
23
A
23
B
23
D
23

2.C++

如何把C++中有的容器也用在JAVA中。需要注意的是,尽管C++中的容器在JAVA中也能使用,但是,并不是完全一样的,可能在JAVA中效率很低。这里只是说明在JAVA中也有,具体的使用情况根据实际而定。

2.1 Stack(栈)

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。

因为它继承自Vector,那么它的实现原理是以数组实现堆栈的。如果要以链表方式实现堆栈可以使用LinkedList!Stack只有下面几个方法!由于Stack继承了Vector ,它也有Vector的API方法!

返回值 方法描述
boolean empty()测试此堆栈是否为空。
E peek()查看栈顶元素。
E pop()删除栈顶元素,并将该元素作为返回值返回。
E `push(E item)添加元素到堆栈的顶部。与addElement(item)效果完全相同。
int search(Object o)返回一个对象在此堆栈上的基于1的位置。

来自Vector的方法有:add, add, addAll, addAll, addElement, capacity, clear, clone, contains, containsAll, copyInto, elementAt, elements, ensureCapacity, equals, firstElement, forEach, get, hashCode, indexOf, indexOf, insertElementAt, isEmpty, iterator, lastElement, lastIndexOf, lastIndexOf, listIterator, listIterator, remove, remove, removeAll, removeAllElements, removeElement, removeElementAt, removeIf, removeRange, replaceAll, retainAll, set, setElementAt, setSize, size, sort, spliterator, subList, toArray, toArray, toString, trimToSize

示例:

    public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);Stack<Integer> s = new Stack<Integer>();System.out.println(s.empty()? "是空的":"不是空的");System.out.println("现在Stack的大小为:"+s.size());System.out.println("输入第一个元素:");int a = sc.nextInt();s.push(a);System.out.println(s.empty()? "是空的":"不是空的");System.out.println("现在Stack的大小为:"+s.size());System.out.println("输入第二个元素:");int b = sc.nextInt();s.push(b);System.out.println(s.empty()? "是空的":"不是空的");System.out.println("现在Stack的大小为:"+s.size());System.out.println("输入第三个元素:");int c = sc.nextInt();s.push(c);System.out.println(s.empty()? "是空的":"不是空的");System.out.println("现在Stack的大小为:"+s.size());System.out.println("Stack中的元素有:");while (!s.empty()){System.out.println(s.peek());System.out.println("删除了:"+s.pop()); //删除}}//依次输入
7
13
23
//输出
是空的
现在Stack的大小为:0
输入第一个元素:
7
不是空的
现在Stack的大小为:1
输入第二个元素:
13
不是空的
现在Stack的大小为:2
输入第三个元素:
23
不是空的
现在Stack的大小为:3
Stack中的元素有:
23
删除了:23
13
删除了:13
7
删除了:7

Stack的用法还是挺简单的。

2.2 Vector(向量)

方法有点多。。。。帖张图吧。还有就是vector是线程安全的,所以效率低。

就演示几个常用的就行,其他的可自行了解。

    public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);Vector<String> vs = new Vector<>();//添加vs.add("aaaaaaaaa");vs.add("bbbbbbbbb");vs.add("cccc");vs.add("1566165");System.out.println("元素总共有:"+vs.size());//for输出System.out.println("for遍历输出:");for (int i = 0; i < vs.size(); i++) {System.out.println(vs.get(i));}System.out.println("================================");System.out.println("迭代器遍历输出:");Iterator<String> it = vs.iterator();while (it.hasNext()){System.out.println(it.next());}System.out.println("================================");System.out.println("Enumeration遍历输出:");Enumeration<String> es = vs.elements();while (es.hasMoreElements()){System.out.println(es.nextElement());}System.out.println("==删除元素:========");vs.remove("cccc"); //删除指定元素System.out.println(vs.remove(0)); //删除指定索引元素System.out.println("删除后元素总共有:"+vs.size());//        closeAll();}//输出
元素总共有:4
for遍历输出:
aaaaaaaaa
bbbbbbbbb
cccc
1566165
================================
迭代器遍历输出:
aaaaaaaaa
bbbbbbbbb
cccc
1566165
================================
Enumeration遍历输出:
aaaaaaaaa
bbbbbbbbb
cccc
1566165
==删除元素:========
aaaaaaaaa
删除后元素总共有:2

2.3 Queue(队列)

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

import java.util.LinkedList;
import java.util.Queue;public class Main {public static void main(String[] args) {//add()和remove()方法在失败的时候会抛出异常(不推荐)Queue<String> queue = new LinkedList<String>();//添加元素queue.offer("a");queue.offer("b");queue.offer("c");queue.offer("d");queue.offer("e");for(String q : queue){System.out.println(q);}System.out.println("===");System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除for(String q : queue){System.out.println(q);}System.out.println("===");System.out.println("element="+queue.element()); //返回第一个元素 for(String q : queue){System.out.println(q);}System.out.println("===");System.out.println("peek="+queue.peek()); //返回第一个元素 for(String q : queue){System.out.println(q);}}
}

2.4 PriorityQueue(优先队列)

返回值 方法描述
boolean add(E e)将指定的元素插入到此优先级队列中。
void clear()从此优先级队列中删除所有元素。
Comparator<? super E> comparator()返回用于为了在这个队列中的元素,或比较null如果此队列根据所述排序natural ordering的元素。
boolean contains(Object o)如果此队列包含指定的元素,则返回 true
Iterator<E> iterator()返回此队列中的元素的迭代器。
boolean offer(E e)将指定的元素插入到此优先级队列中。
E peek()检索但不删除此队列的头,如果此队列为空,则返回 null
E poll()检索并删除此队列的头,如果此队列为空,则返回 null
boolean remove(Object o)从该队列中删除指定元素的单个实例(如果存在)。
int size()返回此集合中的元素数。
Spliterator<E> spliterator()在此队列中的元素上创建*late-binding失败快速* Spliterator
Object[] toArray()返回一个包含此队列中所有元素的数组。
<T> T[] toArray(T[] a)返回一个包含此队列中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。

常用方法:

peek()//返回队首元素
poll()//返回队首元素,队首元素出队列
add()//添加元素
size()//返回队列元素个数
isEmpty()//判断队列是否为空,为空返回true,不空返回false

示例:

//自定义比较器,降序排列
static Comparator<Integer> cmp = new Comparator<Integer>() {public int compare(Integer e1, Integer e2) {return e2 - e1;}};
public static void main(String[] args) {//不用比较器,默认升序排列Queue<Integer> q = new PriorityQueue<>();q.add(3);q.add(2);q.add(4);while(!q.isEmpty()){System.out.print(q.poll()+" ");}/*** 输出结果* 2 3 4 *///使用自定义比较器,降序排列Queue<Integer> qq = new PriorityQueue<>(cmp);qq.add(3);qq.add(2);qq.add(4);while(!qq.isEmpty()){System.out.print(qq.poll()+" ");}/*** 输出结果* 4 3 2 */
}

自定义类:

//矩形类
class Node{public Node(int chang,int kuan){this.chang=chang;this.kuan=kuan;}int chang;int kuan;
}public class Test {//自定义比较类,先比较长,长升序排列,若长相等再比较宽,宽降序static Comparator<Node> cNode=new Comparator<Node>() {public int compare(Node o1, Node o2) {if(o1.chang!=o2.chang)return o1.chang-o2.chang;elsereturn o2.kuan-o1.kuan;}};public static void main(String[] args) {Queue<Node> q=new PriorityQueue<>(cNode);Node n1=new Node(1, 2);Node n2=new Node(2, 5);Node n3=new Node(2, 3);Node n4=new Node(1, 2);q.add(n1);q.add(n2);q.add(n3);Node n;while(!q.isEmpty()){n=q.poll();System.out.println("长: "+n.chang+" 宽:" +n.kuan);}/*** 输出结果* 长: 1 宽:2* 长: 2 宽:5* 长: 2 宽:3*/}
}

优先队列遍历。PriorityQueue的iterator()不保证以任何特定顺序遍历队列元素。若想按特定顺序遍历,先将队列转成数组,然后排序遍历

Queue<Integer> q = new PriorityQueue<>(cmp);int[] nums= {2,5,3,4,1,6};for(int i:nums){q.add(i);}Object[] nn=q.toArray();Arrays.sort(nn);for(int i=nn.length-1;i>=0;i--)System.out.print((int)nn[i]+" ");/*** 输出结果* 6 5 4 3 2 1 */

比较器生降序说明

Comparator<Object> cmp = new Comparator<Object>() {public int compare(Object o1, Object o2) {//升序return o1-o2;//降序return o2-o1;}};

2.5 Pair

获取Key值:getKey()。

获取Value值:getValue()。

public static void main(String[] args) throws Exception {Scanner sc = new Scanner(System.in);//单个Pair<String,Integer> test = new Pair<>("qwer",234);System.out.println(test.getKey());System.out.println(test.getValue());//数组Pair<String,Integer>[] pair = new Pair[52];pair[0] = new Pair<>("23",23);pair[1] = new Pair<>("2323",2323);pair[2] = new Pair<>("223343",2343);for (int i = 0; i < 3; i++) {String s = pair[i].getKey();System.out.println(s);int t  = pair[i].getValue();System.out.println(t);}}

2.6 Deque(双端队列)

Deque是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。

注意:Java堆栈Stack类已经过时,Java官方推荐使用Deque替代Stack使用。Deque堆栈操作方法:push()、pop()、peek()。

Deque有三种用途:

  • 普通队列(一端进另一端出):
    Queue queue = new LinkedList()或Deque deque = new LinkedList()

  • 双端队列(两端都可进出)
    Deque deque = new LinkedList()

  • 堆栈
    Deque deque = new LinkedList()

  1. 在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。
Queue方法 等效Deque方法
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()
  1. 双端队列也可用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。
堆栈方法 等效Deque方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

当作普通队列,就用普通队列的方法,当作双端队列就用双端队列的方法,当作堆栈就用堆栈的方法。

说明

offer,add 区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll,remove 区别:

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

蓝桥杯JAVA-7.集合(容器)在竞赛中的使用相关推荐

  1. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  2. 2020年 第11届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  3. 蓝桥杯——Java中的全排列算法

    蓝桥杯--Java中的全排列 全排列的概念 排列 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.不同的顺序是一个不同的排列.从n个元素中取m ...

  4. 2015年 第06届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  5. 2019年 第10届 蓝桥杯 Java B组 决赛真题详解及小结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:大部 ...

  6. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  7. 2018年 第9届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  8. 2016年 第7届 蓝桥杯 Java B组 省赛解析及总结

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[2013年(第4届)~2021年(第12届)] 第11届 蓝桥杯-第1.2次模拟(软件类)真题-(2020年3月.4月)-官方讲解视频 说明:部分 ...

  9. 2016蓝桥杯b组java试题及答案_2016年第七届蓝桥杯java B组省赛试题

    2016年第七届蓝桥杯java B组省赛试题 1-3.结果填空 4-5.代码填空 6-7.结果填空 8-10.程序设计 1.煤球数目  (结果填空) 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, ...

  10. 2022第13届蓝桥杯Java省赛B组个人题解

    文章目录 A. 星期计算 B. 山 C. 字符统计 D. 最少刷题数 E. 求阶乘 F. 最大子矩阵 G. 数组切分 H. 回忆迷宫 I. 红绿灯 J. 拉箱子 个人总结 A. 星期计算 思路解析: ...

最新文章

  1. 解决:Error: Aesthetics must be either length 1 or the same as the data (5): fill
  2. RxJava操作符在android中的使用场景详解(一)
  3. shardingjdbc全局表_sharding-jdbc实现按年分库按月分表
  4. 您如何重命名MongoDB数据库?
  5. 以58帮帮为例看58同城典型技术架构演变
  6. php性能优化和细节优化
  7. 2021-09-15
  8. java 泛型详解、Java中的泛型方法、 java泛型详解
  9. 菜鸟+Hologres=智能物流
  10. 从0开始架构一个IOS程序——iOS 根据文字的长度来动态设置UILabel的大小
  11. Python爬虫_Cookie
  12. 怎么取消XP粘滞键(StickyKeys)
  13. 注解、路径、 Log4J、<settings>标签
  14. quartz监听器使用
  15. 如何检索Python函数的源代码
  16. 60级怀旧服最新服务器人口排名,魔兽世界怀旧服10月最新人口普查详情 各大服务器阵营详细比例...
  17. pthread_create()函数
  18. 换手率:为什么美国人不爱频繁申赎基金?
  19. linux软件源哪个好,Linux 软件源
  20. 旅行商问题和背包问题

热门文章

  1. linux格式化fat的命令,linux格式化命令详解
  2. npm install 提示权限不足
  3. does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE),
  4. 解决控制台Could not resolve view with name ...
  5. Vscode几个有趣的插件
  6. 数据结构—2-3树、2-3-4树、B树、B+树等多路查找树的原理详解
  7. 【浙政钉埋点】Vue中使用浙政钉的埋点详解
  8. 使用FBSimulatorControl做模拟器适配测试(模拟器多开)
  9. 用什么软件可以检测苹果耳机芯片_创新发布Sound Blaster X3外置声卡:支持新一代Super XFi耳机音效...
  10. ssm基于JavaEE的电脑销售管理系统设计与实现毕业设计源码