1.Set集合

1.1Set集合概述和特点【应用】

  • 可以去除重复

  • 存取顺序不一致
  • 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素

1.2Set集合的使用【应用】

存储字符串并遍历

package com.itheima.myset;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; /*
*Set集合的基本使用
* */
public class MySet1 {
public static void main(String[] args) {
Set<String> set=new TreeSet<>();
set.add("ccc");
set.add("aaa");
set.add("aaa");
set.add("bbb"); for (int i = 0; i < set.size(); i++) {
//Set集合时没有索引的,所以不能通过索引获取元素的方法
} Iterator<String> it=set.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s); }
System.out.println("=============");
for (String s : set) {
System.out.println(s);
}
} }

2.TreeSet集合

2.1TreeSet集合概述和特点【应用】

  • 不包含重复元素的集合

  • 没有带索引的方法

  • 可以将元素按照规则进行排序                想要使用TreeSet,需要制定排序规则

    • TreeSet():根据其元素的自然排序进行排序

    • TreeSet(Comparator comparator) :根据指定的比较器进行排序

2.2TreeSet集合基本使用【应用】

存储Integer类型的整数并遍历

public class TreeSetDemo01 {
public static void main(String[] args) {
//创建集合对象
TreeSet<Integer> ts = new TreeSet<Integer>(); //添加元素
ts.add(10);
ts.add(40);
ts.add(30);
ts.add(50);
ts.add(20); ts.add(30); //遍历集合
for(Integer i : ts) {
System.out.println(i);
}
}
}

2.3自然排序Comparable的使用【应用】

  • 案例需求

    • 存储学生对象并遍历,创建TreeSet集合使用无参构造方法

    • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

  • 实现步骤

    1. 使用空参构造创建TreeSet集合

      • 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的

    2. 自定义的Student类实现Comparable接口

      • 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法

    3. 重写接口中的compareTo方法

      • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

  • 代码实现

    学生类

package com.itheima.myset;

public class Student implements Comparable<Student>{
private String name;
private int age; public Student() {
} public Student(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} @Override
public int compareTo(Student o) {
//按照对象的年龄进行排序
int result = this.age - o.age;
return result;
}
}

测试类  

package com.itheima.myset;

import java.util.TreeSet;

/*
* TreeSet集合来存储Student类型
*
* */
public class MySet2 {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<>();
Student s1=new Student("小花",28);
Student s2=new Student("小花花",27);
Student s3=new Student("小小花",29); ts.add(s1);
ts.add(s2);
ts.add(s3); System.out.println(ts);
}
}

自然排序简单原理图

如果返回值为负数,表示当前存入的元素是较小值,存左边

如果返回值为0,表示当前存入的元素跟集合中额元素重复了,不存。

如果返回值为正数,表示当前存入的元素是较大值,存右边

按照年龄排序

需求:改写刚刚的学生案例:

需求:按照年龄从小到大排,如果年龄一样,则按照姓名首字母排序

  如果姓名和年龄一样,才认为是同一个学生对象,不存入

Student

package com.itheima.myset;

public class Student implements Comparable<Student> {
private String name;
private int age; public Student() {
} public Student(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
} @Override
public int compareTo(Student o) {
//按照对象的年龄进行排序
//主要判断条件
int result = this.age - o.age;
//次要判断条件
result = result == 0 ? this.name.compareTo(o.getName()) : result;
return result;
}
}

  实现类

package com.itheima.myset;

import java.util.TreeSet;

/*
* TreeSet集合来存储Student类型
*
* */
public class MySet2 {
public static void main(String[] args) {
TreeSet<Student> ts=new TreeSet<>();
Student s1=new Student("zhangsan",28);
Student s2=new Student("lisi",27);
Student s3=new Student("wangwu",29);
Student s4=new Student("zhaoliu",28);
Student s5=new Student("qianqi",30); ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5); System.out.println(ts);
}
}

  comparTo()

package com.itheima.mytreeset;

public class MyTreeSet3 {
public static void main(String[] args) {
String s1="aaa";
String s2="bcb";
System.out.println(s1.compareTo(s2));
//首先比较第一个字母,如果第一个字母是一样的,那么比较后面的字母
//当不一样的时候,就拿着对应的码表值97,减去b的码表值98
//认为a是比b小的
}
}

2.4比较器排序Comparator的使用【应用】

  • 案例需求

    • 存储老师对象并遍历,创建TreeSet集合使用带参构造方法

    • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

  • 实现步骤

    • 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的

    • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法

    • 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

  • 代码实现

    老师类

package com.itheima.mytreeset;

public class Teacher {
private String name;
private int age; public Teacher() {
} public Teacher(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

测试类  

package com.itheima.mytreeset;

import java.util.Comparator;
import java.util.TreeSet; public class MyTreeSet4 {
public static void main(String[] args) {
TreeSet<Teacher> ts=new TreeSet<>(new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
//o1表示现在要存入的那个元素
//o2表示已经存入到集合中的元素 //主要条件
int result = o1.getAge() - o2.getAge();
//次要条件
result=result==0?o1.getName().compareTo(o2.getName()):result;
return result;
}
});
Teacher t1=new Teacher("zhangsan",23);
Teacher t2=new Teacher("lisi",22);
Teacher t3=new Teacher("wangwu",24);
Teacher t4=new Teacher("zhaoliu" ,24);
ts.add(t1);
ts.add(t2);
ts.add(t3);
ts.add(t4);
System.out.println(ts);
}
}

2.4两种比较方式总结【理解】

  • 两种比较方式小结

    • 自然排序: 自定义类实现Comparable接口,重写compareTo方法,根据返回值进行排序

    • 比较器排序: 创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序

    • 在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,必须使用比较器排序

  • 两种方式中关于返回值的规则

    • 如果返回值为负数,表示当前存入的元素是较小值,存左边

    • 如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存

    • 如果返回值为正数,表示当前存入的元素是较大值,存右边

案例:按照字符串的长短排序

需求:请自行选择比较器排序和自然排序两种方式

需求:存入四个字符串,“c”,"ab","df","qwer"   按照长度排序,如果一样长则按照首字母排序

package com.itheima.mytreeset;

import java.util.Comparator;
import java.util.TreeSet; public class MyTreeSet5 {
public static void main(String[] args) {
// TreeSet<String> ts=new TreeSet<>(new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// int result = o1.length() - o2.length();
// result=result==0?o1.compareTo(o2):result;
// return result;
// }
// }); TreeSet<String> ts = new TreeSet<>(
(String o1, String o2) -> {
int result = o1.length() - o2.length();
result = result == 0 ? o1.compareTo(o2) : result;
return result;
}
); ts.add("c");
ts.add("ab");
ts.add("df");
ts.add("qwer"); System.out.println(ts);
}
}

 //[c, ab, df, qwer] 

  

  

  

26.Set的更多相关文章

  1. CSharpGL(26)在opengl中实现控件布局/渲染文字

    CSharpGL(26)在opengl中实现控件布局/渲染文字 效果图 如图所示,可以将文字.坐标轴固定在窗口的一角. 下载 CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入( ...

  2. C#开发微信门户及应用(26)-公众号微信素材管理

    微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理,永久素材可以永久保留在微信服务器上,微信素材可以在上传后,进行图片文件或者图文消息的 ...

  3. grep-2.26 sed-4.2.2 awk-4.1.4 wget-1.18 pcregrep-8.39 pcre2grep-10.22 for windows 最新版本静态编译

    -------------------------------------------------------------------------------------------- grep (G ...

  4. TMS320F28027/26/23/22/21/20芯片解密单片机破解原理!

    TMS320F28027/26/23/22/21/20芯片解密单片机破解 TMS320F2802系列芯片解密型号: TMS320F28027F.TMS320F280270.TMS320F28027.T ...

  5. [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

    [.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitS ...

  6. 编写高质量代码:改善Java程序的151个建议(第2章:基本类型___建议26~30)

    建议26:提防包装类型的null值 我们知道Java引入包装类型(Wrapper Types)是为了解决基本类型的实例化问题,以便让一个基本类型也能参与到面向对象的编程世界中.而在Java5中泛型更是 ...

  7. 背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null

    [源码下载] 背水一战 Windows 10 (26) - XAML: x:DeferLoadStrategy, x:Null 作者:webabcd 介绍背水一战 Windows 10 之 XAML ...

  8. 新手指南: Linux 新手应该知道的 26 个命令

    当你进入了 Linux 的世界,在下载.安装 了某个 Linux 发行版,体验了 Linux 桌面并安装了一些你喜爱和需要的软件之后,应该去了解下 Linux 真正的魅力所在:命令行.每一个 Linu ...

  9. Java编程中“为了性能”需做的26件事

    1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: (1)控制资源的使用,通过线程同步来控制 ...

  10. System.Data.SqlClient.SqlException: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: SQL Network Interfaces, error: 26 - 定位指定的服务器/实例时出错)

    A network-related or instance-specific error occurred while establishing a connection to SQL Server. ...

随机推荐

  1. 小白的第一次sql实战

    去年发的有一篇sql注入忘记粘贴过来了,今天想起了就fuzz过来一下 有id尝试sql注入 找这种sql注入的站用sql检索就行了,但是最好挂代理用谷歌搜索,百度的话搜sql注入的很多被别人打过了,导 ...

  2. Android Studio 之生成正式签名的 APK 文件

    生成 APK 文件 •步骤 点击  Build -> Generate Signed...... : 来到如下界面: 选择 APK 选项,点击 Next 来到如下界面: 如果你电脑上没有一个正式 ...

  3. Kafka 消息存储机制

    Kafka 消息以 Partition 作为存储单元,那么在 Partition 内消息是以什么样的格式存储的呢,如何处理 Partition 中的消息,又有哪些安全策略来保证消息不会丢失呢,这一篇我 ...

  4. 2021年春软件工程"助教团队"成员介绍

    2021年春软件工程 助教团队 成员介绍 项目 内容 这个作业属于那个课程 2021春季学期软件工程(罗杰.任健) 这个作业的要求在哪里 团队介绍 姓名 照片 个人介绍 分工 刘Q 本团队的PM,和助 ...

  5. 痞子衡嵌入式:在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Flash工作频率与Dummy Cycle的联系. 上一篇文章 <从头开始认识i.MXRT启动头FDCB里的lookupTable ...

  6. NLP入门学习中关于分词库HanLP导入使用教程

    大家好,时隔多年再次打开我的博客园写下自己的经验和学习总结,开园三年多,文章数少得可怜,一方面自己技术水平局限,另一方面是自己确实想放弃写博客.由于毕业工作的原因,经常性的加班以及仅剩下少的可怜的休息 ...

  7. Spring Boot入门学习

    1. Spring Boot概述 1.1.什么是Spring Boot SpringBoot是一个可使用Java构建微服务的微框架.是Spring框架及其社区对"约定优先于配置"理 ...

  8. Java(100-113)【类与对象、封装、构造方法】

    1.对象的创建以及使用 Student stu =new Student(); 根据一个类创建一个对象 导包.创建.使用 2.手机练习 有main才能run Phone.java package cn ...

  9. 【Azure Developer】调用SDK的runPowerShellScript方法,在Azure VM中执行PowerShell脚本示例

    当需要通过代码的方式执行PowerShell脚本时,可以参考以下的示例. Azure SDK中提供了两个方法来执行PowerShell脚本 (SDK Source Code: https://gith ...

  10. java中switch的用法

    switch关键字对于多数java学习者来说并不陌生,由于笔试和面试经常会问到它的用法,这里做了一个简单的总结: 能用于switch判断的类型有:byte.short.int.char(JDK1.6) ...