A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 柳柳桑 黑马粉丝团   /  2015-12-25 11:25  /  9711 人查看  /  30 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文


入学基础day17笔记

17.01_集合框架(HashSet存储字符串并遍历)
  • A:Set集合概述及特点
    • 通过API查看即可
  • B:案例演示

    • HashSet存储字符串并遍历
      1. HashSet<String> hs = new HashSet<>();
      2. boolean b1 = hs.add("a");
      3. boolean b2 = hs.add("a");           //当存储不成功的时候,返回false

      4. System.out.println(b1);
      5. System.out.println(b2);
      6. for(String s : hs) {
      7.     System.out.println(s);
      8. }
      复制代码


17.02_集合框架(HashSet存储自定义对象保证元素唯一性)
  • A:案例演示

    • 存储自定义对象,并保证元素唯一性。
      1. HashSet<Person> hs = new HashSet<>();
      2. hs.add(new Person("张三", 23));
      3. hs.add(new Person("张三", 23));
      4. hs.add(new Person("李四", 23));
      5. hs.add(new Person("李四", 23));
      6. hs.add(new Person("王五", 23));
      7. hs.add(new Person("赵六", 23));
      复制代码

  • 重写hashCode()和equals()方法

17.03_集合框架(HashSet存储自定义对象保证元素唯一性图解及代码优化)
  • A:画图演示
    • 画图说明比较过程
  • B:代码优化
    • 为了减少比较,优化hashCode()代码写法。
    • 最终版就是自动生成即可。

17.04_集合框架(HashSet如何保证元素唯一性的原理)
  • 1.HashSet原理
    • 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
    • 当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
      • 如果没有哈希值相同的对象就直接存入集合
      • 如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存

  • 2.将自定义类的对象存入HashSet去重复
    • 类中必须重写hashCode()和equals()方法
    • hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
    • equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储

17.05_集合框架(LinkedHashSet的概述和使用)
  • A:LinkedHashSet的特点
  • B:案例演示
    • LinkedHashSet的特点
      • 可以保证怎么存就怎么取

17.06_集合框架(产生10个1-20之间的随机数要求随机数不能重复)
  • A:案例演示

    • 需求:编写一个程序,获取10个1至20的随机数,要求随机数不能重复。并把最终的随机数输出到控制台。
      1. HashSet<Integer> hs = new HashSet<>();      //创建集合对象
      2. Random r = new Random();                    //创建随机数对象

      3. while(hs.size() < 10) {
      4.     int num = r.nextInt(20) + 1;            //生成1到20的随机数
      5.     hs.add(num);
      6. }

      7. for (Integer integer : hs) {                //遍历集合
      8.     System.out.println(integer);            //打印每一个元素
      9. }
      复制代码


17.07_集合框架(练习)
  • 使用Scanner从键盘读取一行输入,去掉其中重复字符, 打印出不同的那些字符

    • aaaabbbcccddd
      1. Scanner sc = new Scanner(System.in);            //创建键盘录入对象
      2. System.out.println("请输入一行字符串:");
      3. String line = sc.nextLine();                    //将键盘录入的字符串存储在line中
      4. char[] arr = line.toCharArray();                //将字符串转换成字符数组
      5. HashSet<Character> hs = new HashSet<>();        //创建HashSet集合对象

      6. for(char c : arr) {                             //遍历字符数组
      7.     hs.add(c);                                  //将字符数组中的字符添加到集合中
      8. }

      9. for (Character ch : hs) {                       //遍历集合
      10.     System.out.println(ch);
      11. }
      复制代码


17.08_集合框架(练习)
  • 将集合中的重复元素去掉
    1.     public static void main(String[] args) {
    2.         ArrayList<String> list = new ArrayList<>();
    3.         list.add("a");
    4.         list.add("a");
    5.         list.add("a");
    6.         list.add("b");
    7.         list.add("b");
    8.         list.add("b");
    9.         list.add("b");
    10.         list.add("c");
    11.         list.add("c");
    12.         list.add("c");
    13.         list.add("c");

    14.         System.out.println(list);
    15.         System.out.println("去除重复后:");
    16.         getSingle(list);
    17.         System.out.println(list);
    18.     }

    19.     /*
    20.      * 将集合中的重复元素去掉
    21.      * 1,void
    22.      * 2,List<String> list
    23.      */

    24.     public static void getSingle(List<String> list) {
    25.         LinkedHashSet<String> lhs = new LinkedHashSet<>();
    26.         lhs.addAll(list);                                   //将list集合中的所有元素添加到lhs
    27.         list.clear();                                       //清空原集合
    28.         list.addAll(lhs);                                   //将去除重复的元素添回到list中
    29.     }
    复制代码

17.09_集合框架(TreeSet存储Integer类型的元素并遍历)
  • A:案例演示
    • TreeSet存储Integer类型的元素并遍历

17.10_集合框架(TreeSet存储自定义对象)
  • A:案例演示
    • 存储Person对象

17.11_集合框架(TreeSet保证元素唯一和自然排序的原理和图解)
  • A:画图演示
    • TreeSet保证元素唯一和自然排序的原理和图解

17.12_集合框架(TreeSet存储自定义对象并遍历练习1)
  • A:案例演示
    • TreeSet存储自定义对象并遍历练习1(按照姓名排序)

17.13_集合框架(TreeSet存储自定义对象并遍历练习2)
  • A:案例演示
    • TreeSet存储自定义对象并遍历练习2(按照姓名的长度排序)

17.14_集合框架(TreeSet保证元素唯一和比较器排序的原理及代码实现)
  • A:案例演示
    • TreeSet保证元素唯一和比较器排序的原理及代码实现

17.15_集合框架(TreeSet原理)
  • 1.特点
    • TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
  • 2.使用方式
    • a.自然顺序(Comparable)
      • TreeSet类的add()方法中会把存入的对象提升为Comparable类型
      • 调用对象的compareTo()方法和集合中的对象比较
      • 根据compareTo()方法返回的结果进行存储
    • b.比较器顺序(Comparator)
      • 创建TreeSet的时候可以制定 一个Comparator
      • 如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
      • add()方法内部会自动调用Comparator接口中compare()方法排序
      • 调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
    • c.两种方式的区别
      • TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
      • TreeSet如果传入Comparator, 就优先按照Comparator

17.16_集合框架(练习)
  • 在一个集合中存储了无序并且重复的字符串,定义一个方法,让其有序(字典顺序),而且还不能去除重复
    1.     public static void main(String[] args) {
    2.         ArrayList<String> list = new ArrayList<>();
    3.         list.add("ccc");
    4.         list.add("ccc");
    5.         list.add("aaa");
    6.         list.add("aaa");
    7.         list.add("bbb");
    8.         list.add("ddd");
    9.         list.add("ddd");

    10.         sort(list);
    11.         System.out.println(list);
    12.     }

    13.     /*
    14.      * 对集合中的元素排序,并保留重复
    15.      * 1,void
    16.      * 2,List<String> list
    17.      */
    18.     public static void sort(List<String> list) {
    19.         TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {       //定义比较器(new Comparator(){}是Comparator的子类对象)

    20.             @Override
    21.             public int compare(String s1, String s2) {                      //重写compare方法
    22.                 int num = s1.compareTo(s2);                                 //比较内容
    23.                 return num == 0 ? 1 : num;                                  //如果内容一样返回一个不为0的数字即可
    24.             }
    25.         });

    26.         ts.addAll(list);                                                    //将list集合中的所有元素添加到ts中
    27.         list.clear();                                                       //清空list
    28.         list.addAll(ts);                                                    //将ts中排序并保留重复的结果在添加到list中
    29.     }
    复制代码

17.17_集合框架(练习)
  • 从键盘接收一个字符串, 程序对其中所有字符进行排序,例如键盘输入: helloitcast程序打印:acehillostt
    1. Scanner sc = new Scanner(System.in);            //创建键盘录入对象
    2. System.out.println("请输入一行字符串:");
    3. String line = sc.nextLine();                    //将键盘录入的字符串存储在line中
    4. char[] arr = line.toCharArray();                //将字符串转换成字符数组
    5. TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {

    6.     @Override
    7.     public int compare(Character c1, Character c2) {
    8.         //int num = c1.compareTo(c2);
    9.         int num = c1 - c2;                  //自动拆箱
    10.         return num == 0 ? 1 : num;
    11.     }
    12. });

    13. for(char c : arr) {
    14.     ts.add(c);
    15. }

    16. for(Character ch : ts) {
    17.     System.out.print(ch);
    18. }
    复制代码

17.18_集合框架(练习)
  • 程序启动后, 可以从键盘输入接收多个整数, 直到输入quit时结束输入. 把所有输入的整数倒序排列打印. Scanner sc = new Scanner(System.in);        //创建键盘录入对象 System.out.println("请输入:"); TreeSet ts = new TreeSet<>(new Comparator() {//将比较器传给TreeSet的构造方法
    1.         @Override
    2.         public int compare(Integer i1, Integer i2) {
    3.             //int num = i2 - i1;                    //自动拆箱
    4.             int num = i2.compareTo(i1);
    5.             return num == 0 ? 1 : num;
    6.         }
    7.     });

    8.     while(true) {
    9.         String line = sc.nextLine();            //将键盘录入的字符串存储在line中
    10.         if("quit".equals(line))                 //如果字符串常量和变量比较,常量放前面,这样不会出现空指针异常,变量里面可能存储null
    11.             break;
    12.         try {
    13.             int num = Integer.parseInt(line);       //将数字字符串转换成数字
    14.             ts.add(num);
    15.         } catch (Exception e) {
    16.             System.out.println("您录入的数据有误,请输入一个整数");
    17.         }

    18.     }

    19.     for (Integer i : ts) {                      //遍历TreeSet集合
    20.         System.out.println(i);
    21.     }
    复制代码

17.19_集合框架(键盘录入学生信息按照总分排序后输出在控制台)
  • A:案例演示

    • 需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低输出到控制台。 Scanner sc = new Scanner(System.in); System.out.println("请输入5个学生成绩格式是:(姓名,语文成绩,数学成绩,英语成绩)"); TreeSet ts = new TreeSet<>(new Comparator() { @Override public int compare(Student s1, Student s2) { int num = s2.getSum() - s1.getSum();        //根据学生的总成绩降序排列 return num == 0 ? 1 : num; } });
      1. while(ts.size() < 5) {
      2.     String line = sc.nextLine();
      3.     try {
      4.         String[] arr = line.split(",");
      5.         int chinese = Integer.parseInt(arr[1]);             //转换语文成绩
      6.         int math = Integer.parseInt(arr[2]);                //转换数学成绩
      7.         int english = Integer.parseInt(arr[3]);             //转换英语成绩
      8.         ts.add(new Student(arr[0], chinese, math, english));
      9.     } catch (Exception e) {
      10.         System.out.println("录入格式有误,输入5个学生成绩格式是:(姓名,语文成绩,数学成绩,英语成绩");
      11.     }

      12. }

      13. System.out.println("排序后的学生成绩是:");
      14. for (Student s : ts) {
      15.     System.out.println(s);
      16. }
      复制代码


17.20_day17总结
  • 1.List
    • a.普通for循环, 使用get()逐个获取
    • b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    • c.增强for循环, 只要可以使用Iterator的类都可以用
    • d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
  • 2.Set
    • a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
    • b.增强for循环, 只要可以使用Iterator的类都可以用
  • 3.普通for循环,迭代器,增强for循环是否可以在遍历的过程中删除


点评

不错...............................  发表于 2017-3-27 12:57

30 个回复

倒序浏览
这个知识点咱们在这保存一下.
回复 使用道具 举报
刚好学到这里..看看,很有用啊
回复 使用道具 举报
谢谢分享 学以致用
回复 使用道具 举报
刚好学到这里,看看很有用
回复 使用道具 举报
还可以,赞yige
回复 使用道具 举报
学完这章节了
回复 使用道具 举报
6666,复习复习、
回复 使用道具 举报
互补一下,不错,顶
回复 使用道具 举报
不错不错,只要有网络就能找到笔记,不用下载很好,点个赞
回复 使用道具 举报
今天练习好多啊!!!加油
回复 使用道具 举报
当天笔记都有,还能不能更吊
回复 使用道具 举报
本帖最后由 夜空的美 于 2016-5-8 21:23 编辑

点个赞,感谢楼主的分享  好好学习 {:2_36:}
回复 使用道具 举报
and2long 发表于 2016-1-7 21:20
这个知识点咱们在这保存一下.

好的                     
回复 使用道具 举报
不错,全都保存下来了,谢谢楼主分享
回复 使用道具 举报
谢谢,顶顶~~
回复 使用道具 举报
点个赞,感谢楼主的分享  好好学习
回复 使用道具 举报
谢谢分享  看看喽
回复 使用道具 举报
也是刚刚学到这里   很有用
回复 使用道具 举报
哈哈哈哈,
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马