前言:本笔记中内容将继续完善笔记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,数据结构等等…为成为一名优秀的后端开发奋斗吧!