Java基础 学习笔记10

前言:本笔记中内容将继续完善笔记7,8,9中相关代码的功能,请先观看笔记7,8,9中相关代码,了解原理后再来学习本笔记中内容:
Java基础 学习笔记7
Java基础 学习笔记8
Java基础 学习笔记9

1.学生选课-判断Map中是否包含指定的key和value
修改一下MapTest类中的内容,写一个MapTest2类:

package com.imooc.collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class MapTest2 {
    public Map<String, Student> students; //用于承装学生类型对象
    //在构造方法中初始化students属性
    public MapTest2() {
        this.students = new HashMap<String, Student>();
    }
    /*测试添加:输入学生ID,判断是否被占用
      若未被占用,则输入姓名,创建新学生对象,并且添加到students中
     */
    public void testPut() {
        //创建一个Scanner对象,用来获取输入的学生ID和姓名
        Scanner console = new Scanner(System.in);
        int i = 0;
        while(i < 3) {
            System.out.println("请输入学生ID:");
            String id = console.next();
            /*判断该ID是否被占用,使用get方法,需要把键作为一个参数传递进去
            如果映射关系存在,get方法返回的就是键所对应的value值
            如果不存在,则返回一个空对象null值
             */
            Student st = students.get(id);
            if (st == null) {
                //提示输入学生姓名
                System.out.println("请输入学生姓名:");
                String name = console.next();
                //创建新的学生对象
                Student newStudent = new Student(id, name);
                //通过调用students的put方法,添加ID-学生映射
                students.put(id, newStudent);
                System.out.println("成功添加学生:" + students.get(id).name);
                i++;
            } else {
                System.out.println("该学生ID已被占用!");
                continue;
            }
        }
    }

    //测试Map的keySet方法
    public void testKeySet() {
        //通过keySet方法返回Map中的所有键的set集合
        Set<String> keySet = students.keySet();
        //取得students的容量
        System.out.println("总共有" + students.size() + "个学生!");
        //遍历keySet对象,来取得每一个键,再调用get方法取得每个键对应的value
        for(String stuID: keySet) {
            Student st = students.get(stuID);
            if(st != null)
                System.out.println("学生:" + st.name);
        }
    }

    //测试Map中,是否包含某个key值或某个value值
    public void testContainsKeyOrValue() {
        //提示输入学生id
        System.out.println("请输入要查询的学生id:" );
        Scanner console = new Scanner(System.in);
        String id = console.next();
        //在Map中,用containsKey方法,来判断是否包含某个key值
        System.out.println("您输入的学生id为:" + id + "在学生映射表中是否存在:" + students.containsKey(id));
        if(students.containsKey(id))
            System.out.println("对应的学生为:" + students.get(id).name);
        //提示输入学生姓名
        System.out.println("请输入要查询的学生姓名:");
        String name = console.next();
        //用containsValue方法,来判断是否包含某个Value值
        if (students.containsValue(new Student(null, name)))
            System.out.println("在学生映射表中,确实包含学生:" + name);
        else
            System.out.println("在学生映射表中不存在该学生!");
    }

    public static void main(String[] args) {
        MapTest2 mt = new MapTest2();
        mt.testPut();
        mt.testKeySet();
        mt.testContainsKeyOrValue();
    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述
疑问1:Map 中的containsValue() 方法的参数为什么不是name
解答:用containsValue()方法查询是要根据Map定义的泛型来决定,在Map类型的students中的value就是Student类,所以传递参数肯定也要是Student类的对象,而不是String name。

疑问2:为什么不存在该学生
跟List中的contains方法一样,Map中的containsValue方法也需要调用每一个value值的equals方法去和参数对象进行比较,如果匹配成功,返回结果为true。所以我们仍然让编译器为我们自动重写equals方法(注意只添加name属性),就会得到正确的答案啦!

2.应用Collections.sort()实现List排序
小知识-字符串中的排列顺序:
在这里插入图片描述

package com.imooc.collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class CollectionsTest {
    //通过Collections.sort()方法,对Integer泛型的List进行排序
    //创建一个Integer泛型的List,插入10个100以内不重复的随机整数
    public void testSort1() {
        List<Integer> integerList = new ArrayList<Integer>();
        //插入10个100以内的不重复随机整数
        Random random = new Random();
        Integer k;
        for(int i = 0; i < 10; i++) {
            do {
                k = random.nextInt(100);
            }while (integerList.contains(k));
            integerList.add(k);
            System.out.println("成功添加整数" + k);
        }
        System.out.println("-----------------------排序前------------------------");
        for(Integer integer: integerList) {
            System.out.println("元素:" + integer);
        }
        Collections.sort(integerList);
        System.out.println("-----------------------排序后------------------------");
        for(Integer integer: integerList) {
            System.out.println("元素:" + integer);
        }
    }

    /*对String泛型的List进行排序
    创建String泛型的List,添加三个乱序的String元素
    调用sort方法,再次输出排序后的顺序
     */
    public void testSort2() {
        List<String> stringList = new ArrayList<String>();
        stringList.add("microsoft");
        stringList.add("google");
        stringList.add("apple");
        System.out.println("-----------------------排序前------------------------");
        for(String string: stringList) {
            System.out.println("元素:" + string);
        }
        Collections.sort(stringList);
        System.out.println("-----------------------排序后------------------------");
        for(String string: stringList) {
            System.out.println("元素:" + string);
        }
    }

    public static void main(String[] args) {
        CollectionsTest ct = new CollectionsTest();
        ct.testSort1();
        ct.testSort2();
    }
}

运行结果:
在这里插入图片描述
在这里插入图片描述
3.尝试对学生序列进行排序
下面的代码会报错:
在这里插入图片描述
下面介绍一下Comparable与Comparator:
compareable 是默认比较规则, comparator是临时比较规则
a.Comparable接口------可比较的
实现该接口表示:这个类的实例可以比较大小,可以进行自然排序
定义了默认的比较规则
其实现类需实现compareTo()方法
comparaTo()方法返回正数表示大,负数表示小,0表示相等
b.Comparator接口-----比较工具接口
用于定义临时比较规则,而不是默认比较规则
其实现类需要实现compare()方法
Comparator和Comparable都是Java集合框架的成员
在这里插入图片描述
在学生类中添加一些代码:

package com.imooc.collection;

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class Student implements Comparable<Student>{ //学生类
    public String id;
    public String name;
    public Set<Course> courses; //后面会提到用法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    public Student(String id, String name) {
        this.id = id;
        this.name = name;
        this.courses = new HashSet<Course>();
    }

    @Override
    public int compareTo(Student o) {
        return this.id.compareTo(o.id);
    }
}

写一个collectionsTest2类:

package com.imooc.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class CollectionsTest2 {
    //对其他类型泛型的List进行排序,以Student为例
    public void testSort3() {
        List<Student> studentList = new ArrayList<Student>();
        Random random = new Random();
        studentList.add(new Student(random.nextInt(1000) + "", "Mike"));
        studentList.add(new Student(random.nextInt(1000) + "", "Angela"));
        studentList.add(new Student(random.nextInt(1000) + "", "Lucy"));
        studentList.add(new Student(10000 + "", "Beyonce"));
        System.out.println("-----------------------排序前------------------------");
        for (Student student: studentList) {
            System.out.println("学生:" + student.id + ":" + student.name);
        }
        Collections.sort(studentList);
        System.out.println("-----------------------排序后------------------------");
        for (Student student: studentList) {
            System.out.println("学生:" + student.id + ":" + student.name);
        }
    }

    public static void main(String[] args) {
        CollectionsTest2 ct = new CollectionsTest2();
        ct.testSort3();
    }
}

运行结果:
在这里插入图片描述
如果用Comparator临时排序:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

至此,Java中的一些常用集合框架就介绍完毕,其他框架大家可以参考Java中的api进行自己练习~Java基础知识部分也已经讲解完毕,大家在熟练掌握后,可以开始下一阶段的学习,例如学习mysql,linux,数据结构等等…为成为一名优秀的后端开发奋斗吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值