Set:无序(没有下标) 不重复的集合
一 HashSet
核心:去重
public static void fun1() {//创建一个HashSet//保存 f f aa bb ddHashSet<String> hashSet = new HashSet<>();hashSet.add("f");hashSet.add("f");hashSet.add("a");hashSet.add("a");hashSet.add("b");hashSet.add("b");hashSet.add("d");hashSet.add("d");//有序: 怎么存进去 打印出来就什么顺序//迭代器遍历for (String string : hashSet) {System.out.println(string);}
}

public static void fun2() {//创建Set集合 保存6个人 两重复HashSet<Person> hashSet = new HashSet<>();hashSet.add(new Person("奥特曼",12));hashSet.add(new Person("奥特曼",12));hashSet.add(new Person("假面骑士",14));hashSet.add(new Person("假面骑士",14));hashSet.add(new Person("发送快递",12));hashSet.add(new Person("发送快递",12));for (Person person : hashSet) {System.out.println(person);}
}

而如若想打印的顺序为存储的顺序,需要具有有序的性质,此时使用LinkedHashSet

public static void fun3() {//Linked 表示 有序//怎么存的,打印出来,还是原来的顺序LinkedHashSet<String> set = new LinkedHashSet<>();set.add("f");set.add("f");set.add("a");set.add("a");set.add("b");set.add("b");set.add("d");set.add("d");for (String string : set) {System.out.println(string);}
}

根据HashSet性质,编写几个案例

1.编写一个程序,获取10个1至20的随机数,要求随机数不能重复

public static void fun4() {//编写一个程序,获取10个1至20的随机数,要求随机数不能重复//创建一个set ,循环生成10个随机数添加到Set中,去重//去重系统类的对象,不用重写那两个方法HashSet< Integer> set = new HashSet<>();a:while(set.size() < 10) {
//      for(int i = 0; i < 10 - set.size(); i++) {int rd = (int)(Math.random()*20 + 1);set.add(rd);//自动装箱
//          if (set.size() == 10) {
//              break a;
//          }
//      }}System.out.println(set.size());//10System.out.println(set);//10个不同随机数组
}

2.利用set集合,去除ArrayList集合中的重复元素(操作原ArrayList , ArrayList保存aabbccdd)

public static void main(String[] args) {     HashSet<String> set = new HashSet<>();ArrayList<String> list  = new ArrayList<>();list.add("a");list.add("a");list.add("b");list.add("b");list.add("c");list.add("c");list.add("d");list.add("d");set.addAll(list);//清空list集合list.clear();//所有元素 放回list中list.addAll(set);
}

二 TreeSet
核心:排序

排序步骤:

1.实现Comparable接口

2.重写接口中的compareTo()方法

3.编写你想要的排序规则

public static void fun1() {//创建一个TreeSet 添加几个数 查看效果TreeSet<Integer> set = new TreeSet<>();set.add(1);set.add(4);set.add(5);set.add(2);set.add(3);set.add(3);set.add(3);set.add(8);      set.add(6);set.add(7);System.out.println(set);
}

莫忘了Set集合是无序不重复的,因此打印出来的是

根据TreeSet排序的特点,写几个经典案例

public static void fun2() {//创建一个TreeSet 添加4个人 查看效果//按年龄排序TreeSet<Person> set = new TreeSet<>();set.add(new Person("大海",18));set.add(new Person("恐龙",28));set.add(new Person("地狱",28));set.add(new Person("地狱",22));System.out.println(set);
}

只打印出一个

因为,在Person中重写的compareTo方法,返回的默认值是0

public int compareTo(Person o) {// TODO Auto-generated method stubreturn 0;
}

在实现comparable接口中的方法时:

返回0 不存储元素 只有一个元素

返回正数 打印数据 正序输出

返回负数 打印数据 倒序输出

注意:TreeSet在存储的时候,只跟compareTo方法的返回值有关

@Override
public int compareTo(Person o) {//按年龄排序
//  return  this.age - o.getAge();//按姓名排序
//  return this.name.compareTo(o.getName());//主要按年龄排序 次要按姓名排int num = this.age - o.getAge();//return (num == 0) ? this.name.compareTo(o.getName()) : num;
}

1.在一个集合ArrayList中存储了无序并且重复的字符串

要求:排序,而且不能去除重复(用比较器) 主要按字符串长度比较,次要按字符比

public static void fun4() {ArrayList<String> list = new ArrayList<>();list.add("dahai");list.add("pengqian");list.add("fanpeng");list.add("dahai");list.add("liuzhih");list.add("zhangjianhai");list.add("tianrui");TreeSet<String> set = new TreeSet<>(new StringLengthImpl());set.addAll(list);list.clear();list.addAll(set);System.out.println(list);
}

创建比较器

class StringLengthImpl implements Comparator<String>{//实现比较器方法@Overridepublic int compare(String o1, String o2) {//实现你的比较规则int length = o1.length() - o2.length();//主要按长度,次要按字符串int num = o1.compareTo(o2);int rel = (length == 0) ? num : length;return rel == 0 ? 1 : rel;}
}

2.键盘接收一个字符串,程序对其中所有字符进行排序

public static void fun5() {//键盘接收一个字符串, 程序对其中所有字符进行排序 要求保留重复的System.out.println("请输入一个字符串");Scanner scanner = new Scanner(System.in);String  string = scanner.nextLine();char[] charArray = string.toCharArray();TreeSet<Character> set = new TreeSet<>(new CharImpl());for (int i = 0; i < charArray.length; i++) {set.add(charArray[i]);}System.out.println(set);
}
class CharImpl implements Comparator<Character>{@Overridepublic int compare(Character o1, Character o2) {int num = o1.compareTo(o2);return num == 0? 1 : num;}
}

3.程序启动后,可以从键盘输入接收多个整数,直到输入quit时结束输入,把所有输入的整数倒序排列打印

public static void fun6() {//  程序启动后, 可以从键盘输入接收多个整数,//  直到输入quit时结束输入. //  把所有输入的整数倒序排列打印.System.out.println("请输入一段整数 , quit时结束");Scanner scanner = new Scanner(System.in);
//  String string = scanner.nextLine();
//  char[] charArray = string.toCharArray();
//  TreeSet<Character> set = new TreeSet<>(new Integer1Impl());
//  for (int i = 0; i < charArray.length; i++) {
//      set.add(charArray[i]);
//  }
//  System.out.println(set);//创建setTreeSet<Integer> set = new TreeSet<>(new Integer2Impl());while(true) {//接受用户输入String string = scanner.nextLine();//判断是不是quitif (string.equals("quit")) {break;}//转化成数字int num = Integer.parseInt(string);//保存到集合Set中set.add(num);}System.out.println(set);}
class Integer2Impl implements Comparator<Integer>{@Overridepublic int compare(Integer o1, Integer o2) {int num = o1 - o2 ;return num == 0? 1 : -num;}
}

Java进阶之路~Set集合相关推荐

  1. 《Java 进阶之路》 下--推荐书籍

    真正想提升自己,我感觉最主要的是先把 JVM.并发.网络这三块知识点学会.学通,这三块是基础,后面所有的框架.中间件等相关的都是基于这三块知识点之上的.学完这三块知识点,可以快速的掌握其它的知识,新框 ...

  2. 《java 进阶之路》 上--推荐书籍

    整整一月没有更新博客了,因为十月份和双十一新入手的6本技术相关的书,这个月看完了3本,后面的3本还得慢慢肯. 下面我就介绍下进阶高级工程师必须也是我自己都看的一些书和知识点. 1.深入理解Java虚拟 ...

  3. JAVA进阶之路-CountDownLatch源码走读

    前言 本章用到了之前谈到的AQS,就是在该FIFO阻塞框架的基础上改造的,不理解的,可以去看JAVA进阶之路-AbstractQueuedSynchronizer(AQS)源码走读 用途 CountD ...

  4. JAVA进阶教学之(集合)

    目录 1.集合概述 2.集合存储的数据类型 3.不同的集合,底层都会对应不同的数据结构 4.集合继承结构图(部分接口和类) 5.Collection接口中常用的方法 6.Collection 集合迭代 ...

  5. java进阶之路学习笔记

    如果你现在是Web前端零基础学员,大致可以按如下思路学习系统学习: 一.基础部分 1.HTML + CSS 这部分学习,可以模仿一些网站做些页面.在实践中积累了一些经验后,可以系统的读一两本书,推荐& ...

  6. java集合详解_「软帝学院」Java进阶者专栏:集合框架详解3

    软帝学院笔记Day14 集合框架(HashSet存储字符串并遍历) A:Set集合概述及特点 通过API查看即可 B:案例演示 HashSet存储字符串并遍历 HashSet hs = new Has ...

  7. 怎样重java初级到java中级_(续)Java进阶之路--从初级菜鸟到高级工程师

    基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法. 1.一个".java"源文件中是否可以包括 ...

  8. Java进阶之路对标阿里P6(11)——MYSQL系统化学习(1w字)

    MYSQL 架构演变: 单机单库 主从架构 分库分表 云数据库 一.架构原理 1.1 Mysql体系架构 分为四层:网络连接层.服务层.存储引擎层和系统文件层 查询优化器:选取-投影-联接 策略 日志 ...

  9. Java学习之路-day18 集合02

    Java集合 每日一句 1.Set集合 1.1Set集合概述和特点 1.2Set集合的使用 2.TreeSet集合 2.1TreeSet集合概述和特点 2.2TreeSet集合基本使用 2.3自然排序 ...

最新文章

  1. Java-----applet小程序简介
  2. starting mysql. success!_启动mysql报错解决问题过程
  3. Linux命令-磁盘管理(二)
  4. 利用Helm简化Kubernetes应用部署(1)
  5. jzoj4274-终章-剑之魂【位运算,贪心】
  6. java8并行流_Java 8:CompletableFuture与并行流
  7. 7系统软raid_使用图形界面来配置RAID
  8. 爬虫-11-伪造电脑访问构建一个请求头
  9. JQuery EasyUI Layout 在from布局自适应窗口大小
  10. 古文(诗词文)—— 结构模式与复用
  11. java.util.ConcurrentModificationException的解决办法
  12. 差值多项式的余项定理
  13. vue-cli开发Vue项目时定义环境变量需加VUE_APP前缀
  14. 常用USB芯片介绍(转串口、SPI 、单片机读写U盘)
  15. 商业智能BI推动制造业智能化转型
  16. Linux配置访问服务器图片路径(防止踩坑)
  17. python点图为什么显示不出来怎么办_Python底图不显示打印的点
  18. 万众瞩目!ICF5国产开源飞控推出,为国内无人系统发力
  19. 华为交换机配置mac地址白名单接入
  20. 用“找回你”,查找手机号的前身都被注册过些什么……

热门文章

  1. vue 渲染的list 数据交换顺序,简单就可以实现动画效果
  2. [C/C++]_[初级]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和区别]
  3. 【Rust日报】 2019-04-16 : nude-rs - 高性能黄图检测
  4. 我为什么选择在大二实习?
  5. Typora免费版获取(windows,Linux,MacOs)
  6. 【逻辑漏洞技巧拓展】————1、逻辑至上之各种酷炫姿势
  7. android killer回编译apk后,提示无法安装的解决办法
  8. 如何把Excel的数据导入python?
  9. 【区间dp】关路灯 牛客网题解
  10. i7 11700k和12700k哪个好