前几天做数据结构题碰到了集合,当时并没有学,只是通过做题对此稍微有了了解。今天正好学到了,来做一下学习记录。

一.集合总体框架 

由上图可知,集合的实现方式有两大类:

(1)线性接口:该集合的顶层接口是java.util.Collection,所有集合中的数据都是将自身存储到集合中。

该接口下有两个子接口:

  java.util.List  有序,可重复

  java.util.Set  无序,不可重复

(2)键值映射:该集合的顶层接口是java.util.Map,所有集合中的数据都是以键值映射的方式存储到集合中,即都必须创建一个关键字key,对应一个值value,其中key是唯一的。

我们常用的三个接口是List,Set,Map。

二.集合的功能

集合和数组一样,都是用来存储相同类型数据的容器。

现在我们使用集合时都会和泛型一起使用,使用泛型来约束集合中可以保存的数据类型。

三.常用实现类

我们常用的实现类有:

ArrayList——有序可重复,线性集合中使用最多的一个类,就是一个可变长度的数组。查找易,增删难

LinkedList——有序可重复,链表方式实现的线性集合,增删改易,查找难;

HashSet——散列集合,无序不重复。Set接口中的常用类;

HashMap——Hash算法的键值映射集合,按键找值;

TreeSet——有序不重复,是个有序的Set接口的实现类,经过了排序;

TreeMap——有序的Map接口的实现类。

四.集合的排序

集合的排序指的是List集合的排序,因为Set是无序的,不需要排序。

4.1String类型的集合排序

针对List集合进行排序的方法是Collections.sort()。

是Collections类里的一个静态方法。

我们看String类可见,它实现了Comparable接口,所以具有比较的能力。

案例:

package com.xja.test3;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections; /**
* @描述:
* @author:
* @date:2023/2/2119:13
* @version:
**/
public class T1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("hij");
list.add("abc");
list.add("def");
//未排序前,默认添加顺序排序
System.out.println(list);
//排序
Collections.sort(list);
//排序后
System.out.println(list);
}
}

输出结果:

4.2比较器接口

比较器接口,代表一种可以进行比较的能力,任何类实现了比较器接口,并重写相应的方法,就表示这个类具备了比较大小的能力。

Java中提供了两个比较器接口:

(1)Comparable接口(内置比较器接口)  自然排序

一般写在实体类里,使得该类的某个属性可以进行比较。从而对该实体类的对象进行排序。如:学生在学校默认都是按学号进行排序。

(2)Comparator接口(外置比较器接口)  扩展排序

当我们使用别人编写好的一个类,该类中的比较器不符合我们的要求 ,就可以使用外置比较器。实现Comparator接口,重写comparaTo()方法即可。

如:学校运动会,按跑步成绩进行排序;一次摸底考试,按考试成绩排序,那么之前的按学号排序就不符合我们的需求,这时候就用到了外置比较器。

4.2.1内置比较器接口使用案例

package com.xja.test3;

/**
* @描述:学生类(实体类)
* @author:
* @date:2023/2/2121:06
* @version:
**/
public class Stu implements Comparable<Stu>{
private Integer sid;
private String sname;
private Double sscore; @Override
public int compareTo(Stu o) {
return this.sname.length()-o.sname.length();
} public Stu() {
} public Stu(Integer sid, String sname, Double sscore) {
this.sid = sid;
this.sname = sname;
this.sscore = sscore;
} public Integer getSid() {
return sid;
} public void setSid(Integer sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public Double getSscore() {
return sscore;
} public void setSscore(Double sscore) {
this.sscore = sscore;
} @Override
public String toString() {
return "Stu{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", sscore=" + sscore +
'}';
}
}
package com.xja.test3;

import java.util.ArrayList;
import java.util.Collections; /**
* @描述:内置比较器测试类
* @author:
* @date:2023/2/2121:13
* @version:
**/
public class StuTest1 {
public static void main(String[] args) {
ArrayList<Stu> list = new ArrayList<>();
list.add(new Stu(2,"aa",90D));
list.add(new Stu(1,"cccc",89D));
list.add(new Stu(4,"b",78D));
list.add(new Stu(3,"eee",99D));
//排序前
System.out.println(list);
//排序后
Collections.sort(list);
System.out.println(list);
}
}

输出结果:

[Stu{sid=2, sname='aa', sscore=90.0}, Stu{sid=1, sname='cccc', sscore=89.0}, Stu{sid=4, sname='b', sscore=78.0}, Stu{sid=3, sname='eee', sscore=99.0}]
[Stu{sid=4, sname='b', sscore=78.0}, Stu{sid=2, sname='aa', sscore=90.0}, Stu{sid=3, sname='eee', sscore=99.0}, Stu{sid=1, sname='cccc', sscore=89.0}]

4.2.2外置比较器接口使用案例

package com.xja.test3;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; /**
* @描述:内置比较器测试类
* @author:
* @date:2023/2/2121:13
* @version:
**/
public class StuTest1{
public static void main(String[] args) {
ArrayList<Stu> list = new ArrayList<>();
list.add(new Stu(2,"aa",90D));
list.add(new Stu(1,"cccc",89D));
list.add(new Stu(4,"b",78D));
list.add(new Stu(3,"eee",99D));
//排序前
System.out.println(list);
//内置比较器排序后
Collections.sort(list);
System.out.println(list); //外置比较器使得按成绩排序
Collections.sort(list, new Comparator<Stu>() {
@Override
public int compare(Stu o1, Stu o2) {
if (o1.getSscore()>o2.getSscore()){
return 1;
}else {
return -1;
}
}
});
System.out.println(list);
}
}

输出结果:

[Stu{sid=2, sname='aa', sscore=90.0}, Stu{sid=1, sname='cccc', sscore=89.0}, Stu{sid=4, sname='b', sscore=78.0}, Stu{sid=3, sname='eee', sscore=99.0}]
[Stu{sid=4, sname='b', sscore=78.0}, Stu{sid=2, sname='aa', sscore=90.0}, Stu{sid=3, sname='eee', sscore=99.0}, Stu{sid=1, sname='cccc', sscore=89.0}]
[Stu{sid=4, sname='b', sscore=78.0}, Stu{sid=1, sname='cccc', sscore=89.0}, Stu{sid=2, sname='aa', sscore=90.0}, Stu{sid=3, sname='eee', sscore=99.0}]

集合(Collection)的更多相关文章

  1. Guava库介绍之集合(Collection)相关的API

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...

  2. 【再探backbone 02】集合-Collection

    前言 昨天我们一起学习了backbone的model,我个人对backbone的熟悉程度提高了,但是也发现一个严重的问题!!! 我平时压根没有用到model这块的东西,事实上我只用到了view,所以昨 ...

  3. 5、数组和集合--Collection、Map

    一.数组:同一个类型数据的集合,其实他也是一个容器 1.数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些数据 2.数组的定义: 在Java中常见: 格式1:  类型 [] 数组名 = ne ...

  4. WCF分布式开发步步为赢(8):使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据

    数据集(DataSet).数据表(DataTable).集合(Collection)概念是.NET FrameWork里提供数据类型,在应用程序编程过程中会经常使用其来作为数据的载体,属于ADO.NE ...

  5. 在含有null值的复杂类的集合(Collection)中取最大值

    在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Clas ...

  6. 集合Collection总览

    前言 声明,本文使用的是JDK1.8 从今天开始正式去学习Java基础中最重要的东西--->集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的 ...

  7. java中集合Collection转list对象

    参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...

  8. java基础27 单例集合Collection及其常用方法

    1.集合 集合是存储对象数据的集合容器 1.1.集合比数组的优势 1.集合可以存储任意类型的数据,数组只能存储同一种数据类型的数据    2.集合的长度是变化的,数组的长度是固定的 1.2.数组:存储 ...

  9. 18_java之集合Collection

    01集合使用的回顾 *A:集合使用的回顾 *a.ArrayList集合存储5个int类型元素 public static void main(String[] args) { ArrayList< ...

  10. 集合--Collection接口详解&&迭代器

    /* * 集合的顶层接口--Collection接口 * 添加 * add() * addAll() * * 遍历集合 * iterator() 迭代器 * * 删除 * remove() * rem ...

随机推荐

  1. angular--路由导航三种方法

  2. 模型预处理层介绍(1) - Discretization

    预处理的作用主要在于将难以表达的string或者数组转换成模型容易训练的向量表示,其中转化过程大多是形成一张查询表用来查询. 常见的预处理方式包括: class Discretization: Buc ...

  3. Netty进阶

    1.Netty问题 TCP协议都存在着黏包和半包问题,但是UDP没有 1.粘包现象 发送方分10次发送,接收方一次接受了10次发送的消息 2.半包现象 调整服务器的接受缓冲区大小(调小) 半包会导致服 ...

  4. 视觉十四讲:第九讲_BA优化_g2o

    1.投影模型和BA代价函数 这个流程就是观测方程 之前抽象的记为: \(z = h(x, y)\) 现在给出具体的参数话过程,x指此时相机的位姿R,t,它对应的李代数为\(\xi\).路标y即为这里的 ...

  5. playwright 实现高亮、is_visible 等源码修改

    一. 前言 高亮是什么? 在ui自动化中可以执行js来让某个页面元素高亮,比如背景颜色.字体颜色.边框颜色等发生改变,以此更加方便执行的时候点了哪一步操作.(如果有不清楚怎么实现的可以转到我的介绍se ...

  6. [Ynoi2016] 掉进兔子洞

    \(\text{Solution}\) 莫队配合 \(\text{bitset}\) 发现答案困难的部分在于同一个数在三个区间出现次数的最小值 考虑强行拆开看,用莫队处理出每个区间每个数的出现次数,这 ...

  7. C语言初学习

    首先我们先看一下什么是编译型语言和解释型语言: 解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行 编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂得语言--机器语言 ...

  8. 有理数四则运算 PTA1034

    题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008 本题要求编写程序,计算 2 个有理数的 ...

  9. 解决Revit导出FBX模型材质丢失的问题

    初次使用Revit导出fbx格式模型,在导出模型后发现模型材质丢失了,上网查询之后也没到具体原因是什么,不过倒是找到了解决方式:在Revit中安装naviswork插件,然后从revit中导出nwc格 ...

  10. 简单介绍Python中如何给字典设置默认值

    这篇文章主要介绍了Python中如何给字典设置默认值问题,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 Python字典设置默认值 我们都知道,在 Python 的字 ...