习题改编:
要求:
实现List、Map、Set数据的转换,最后实现Comparable接口的方法完成年龄升序。具体要求如下:
- 创建Student类,使用构造方法Student(int id,String name,int age,String sex)创建多个学生信息并加入List。
- 遍历List,输出每个Student信息。
- 定义方法public void listToMap()将List中Student元素封装到Map,要求Student的id属性作为key,使用Student对象信息作为value,最后输出。
- 创建实体类StudentEntry,使用构造方法StudentEntry(int id,Student student)存储转换的Map信息。
- 定义方法public void mapToList()将Map中Value值Student信息封装到新的List对象,每个元素类型是StudentEntry,最后输出。
- 定义方法public void listToSet()将List中的StudentEntry封装到Set,要求不使用addAll方法。
- 通过Comparable接口的compareTo方法实现按照年龄排序,输出最后结果。
完整代码在最下面
步骤一:
要求:创建Student类,使用构造方法Student(int id,String name,int age,String sex)创建多个学生信息并加入List。
创建Student类,实现封装,IDEA快捷键alt+insert
public class Student {
private int id;
private String name;
private int age;
private String sex;
public int getId() {//封装所以要提供get和set方法,快捷键alt+insert
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(int id, String name, int age, String sex) {//有参构造,快捷键alt+insert
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public Student() {//无参构造
}
}
创建测试类,创建多个学生加入List集合
public class Test {
public static void main(String[] args) {
List<Student> list = new ArrayList();//这样写只是不能用子类独有的方法了,不影响
list.add(new Student(1, "常001", 24, "男"));
list.add(new Student(1, "常08", 24, "男"));
list.add(new Student(2, "00常", 22, "男"));
list.add(new Student(3, "常~", 50, "女"));
list.add(new Student(4, "常常常", 26, "男"));
list.add(new Student(5, "常", 20, "男"));
}
}
步骤二:
要求:遍历List,输出每个Student信息。
由于要输出每个Student信息,Student类重写toString()方法
@Override
public String toString() {//由于题中要输出Student对象,所以重写了toString()方法,快捷键alt+insert
return "学生["+"id="+id+",姓名='"+name+'\''+",年龄="+age+",性别='"+sex+'\''+']';
}
遍历List集合并输出
for (Student stu:list) {//通过增强for遍历
System.out.println(stu);//默认调用stu.toString();输出
}
步骤三:
要求:定义方法public void listToMap()将List中Student元素封装到Map,要求Student的id属性作为key,使用Student对象信息作为value,最后输出。
在主函数外定义该listToMap()方法,参数为List,返回值为Map
static public Map<Integer,Student> listToMap(List<Student> list){
Map<Integer,Student> map = new HashMap<>();//创建Map对象
for (Object stu:list) {//增强for遍历
Student stu1 = (Student) stu;//强转成Student类型
map.put(stu1.getId(),stu1);//向map里添加key为Student的id,value为Student
}
return map;//返回这个Map集合
}
主函数里调用上面的listToMap()方法,并进行遍历输出
Map<Integer, Student> map = listToMap(list);//跳入上面的listToMap方法
Set<Map.Entry<Integer, Student>> entries = map.entrySet();
Iterator<Map.Entry<Integer, Student>> iterator = entries.iterator();
while (iterator.hasNext()){//迭代器遍历
Map.Entry<Integer, Student> next = iterator.next();
System.out.println("key:"+next.getKey()+"\tvalue"+next.getValue());
}
步骤四:
要求:创建实体类StudentEntry,使用构造方法StudentEntry(int id,Student student)存储转换的Map信息。
创建实体类StudentEntry,设置id和Student两个属性,重写toString方法
public class StudentEntry{
private int id;
private Student student;
public StudentEntry(int id,String name,int age,String sex) {
this.id = id;
this.student = new Student(id,name,age,sex);
}
public StudentEntry() {
}
public StudentEntry(int id, Student student) {
this.id = id;
this.student = student;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "StudentEntry{" +
"key=" + id +
", value=" + student.toString() +
'}';
}
}
步骤五:
要求:定义方法public void mapToList()将Map中Value值Student信息封装到新的List对象,每个元素类型是StudentEntry,最后输出。
在主函数外定义该mapToList()方法,参数为Map,返回值为List
static public List mapToList(Map<Integer,Student> map){
List<StudentEntry> list = new ArrayList<>();//创建List对象
Set<Map.Entry<Integer, Student>> entries = map.entrySet();//通过entrySet()转换成Set集合
for (Iterator<Map.Entry<Integer, Student>> iterator = entries.iterator();iterator.hasNext();){//快捷遍历Set集合
Map.Entry<Integer, Student> next = iterator.next();//获取集合中每个元素,每个元素都是一个键值对
list.add(new StudentEntry(next.getKey(),next.getValue()));//创建StudentEntry对象,向List集合添加
}
return list;//返回这个List集合
}
主函数里调用上面的mapToList()方法,并进行遍历输出
List<StudentEntry> list1 = mapToList(map);//跳入上面的mapToList方法
for (int i = 0; i < list1.size(); i++) {//普通for循环遍历
System.out.println(list1.get(i));//StudentEntry重写toString方法了
}
步骤六:
要求:定义方法public void listToSet()将List中的StudentEntry封装到Set,要求不使用addAll方法。
在主函数外定义该listToSet()方法,参数为List,返回值为Set
static public Set listToSet(List<StudentEntry> list){
Set<StudentEntry> set = new TreeSet<>();//子类型是Tree就能排序,向上转型成Set也没事
Iterator<StudentEntry> iterator = list.iterator();
while (iterator.hasNext()){
StudentEntry next = iterator.next();
set.add(next);
}
//set.addAll(list);//上面五行等于这一行
return set;
}
主函数里调用上面的listToSet()方法,先不能输出,因为要重写Comparable接口的compareTo方法
Set<StudentEntry> set = listToSet(list1);//跳入上面的listToSet方法
步骤七:
要求:通过Comparable接口的compareTo方法实现按照年龄排序,输出最后结果。
在StudentEntry重写Comparable接口的compareTo方法
@Override
public int compareTo(StudentEntry o) {
if (o.getId() == this.getId()){//ID一样就算相同的人
return 0;
}
if (this.getStudent().getAge() < o.getStudent().getAge()){//从小到大排
return -1;
}else{
return 1;
}
}
主函数循环遍历输出
for (StudentEntry studentEntry : set) {//增强for遍历
System.out.println(studentEntry);//StudentEntry重写toString方法了
}
结果展示:
全部代码展示:在这里插入图片描述
测试类:
import java.util.*;
public class Test {
/*实现List、Map、Set数据的转换,最后实现Comparable接口的方法完成年龄升序。具体要求如下:
1.创建Student类,使用构造方法Student(int id,String name,int age,String sex)创建多个学生信息并加入List
2.遍历List,输出每个Student信息
3.定义方法public void listToMap()将List中Student元素封装到Map,要求Student的id属性作为key,使用Student对象信息作为value,最后输出
4.创建实体类StudentEntry,使用构造方法StudentEntry(int id,Student student)存储转换的Map信息
5.定义方法public void mapToList()将Map中Value值Student信息封装到新的List对象,每个元素类型是StudentEntry,最后输出
6.定义方法public void listToSet()将List中的StudentEntry封装到Set,要求不使用addAll方法
7.通过Comparable接口的compareTo方法实现按照年龄排序,输出最后结果
*/
public static void main(String[] args) {
List<Student> list = new ArrayList();//这样写只是不能用子类独有的方法了,不影响
list.add(new Student(1, "常001", 24, "男"));
list.add(new Student(1, "常08", 24, "男"));
list.add(new Student(2, "00常", 22, "男"));
list.add(new Student(3, "常~", 50, "女"));
list.add(new Student(4, "常常常", 26, "男"));
list.add(new Student(5, "常", 20, "男"));
for (Student stu:list) {//通过增强for遍历
System.out.println(stu);//默认调用stu.toString();
}
System.out.println("List存Map后====================================");
Map<Integer, Student> map = listToMap(list);//跳入下面的listToMap方法
Set<Map.Entry<Integer, Student>> entries = map.entrySet();
Iterator<Map.Entry<Integer, Student>> iterator = entries.iterator();
while (iterator.hasNext()){//迭代器遍历
Map.Entry<Integer, Student> next = iterator.next();
System.out.println("key:"+next.getKey()+"\tvalue"+next.getValue());
}
System.out.println("Map转List后====================================");
List<StudentEntry> list1 = mapToList(map);//跳入下面的mapToList方法
for (int i = 0; i < list1.size(); i++) {//普通for循环遍历
System.out.println(list1.get(i));//StudentEntry重写toString方法了
}
System.out.println("List转TreeSet并按age排序后***********************");
Set<StudentEntry> set = listToSet(list1);//跳入下面的listToSet方法
for (StudentEntry studentEntry : set) {//增强for遍历
System.out.println(studentEntry);//StudentEntry重写toString方法了
}
}
static public Map<Integer,Student> listToMap(List<Student> list){
Map<Integer,Student> map = new HashMap<>();//创建Map对象
for (Object stu:list) {//增强for遍历
Student stu1 = (Student) stu;//强转成Student类型
map.put(stu1.getId(),stu1);//向map里添加key为Student的id,value为Student
}
return map;//返回这个Map集合
}
static public List mapToList(Map<Integer,Student> map){
List<StudentEntry> list = new ArrayList<>();//创建List对象
Set<Map.Entry<Integer, Student>> entries = map.entrySet();//通过entrySet()转换成Set集合
for (Iterator<Map.Entry<Integer, Student>> iterator = entries.iterator();iterator.hasNext();){//快捷遍历Set集合
Map.Entry<Integer, Student> next = iterator.next();//获取集合中每个元素,每个元素都是一个键值对
list.add(new StudentEntry(next.getKey(),next.getValue()));//创建StudentEntry对象,向List集合添加
}
return list;//返回这个List集合
}
static public Set listToSet(List<StudentEntry> list){//由于要age排序,所以StudentEntry要重写Comparable的compareTo方法
Set<StudentEntry> set = new TreeSet<>();//子类型是Tree就能排序,向上转型成Set也没事
Iterator<StudentEntry> iterator = list.iterator();
while (iterator.hasNext()){
StudentEntry next = iterator.next();
set.add(next);
}
// set.addAll(list);
return set;
}
}
Student类:
package com.jr.test.test05;
public class Student {
private int id;
private String name;
private int age;
private String sex;
public int getId() {//封装所以要提供get和set方法,快捷键alt+insert
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Student(int id, String name, int age, String sex) {//有参构造,快捷键alt+insert
this.id = id;
this.name = name;
this.age = age;
this.sex = sex;
}
public Student() {//无参构造
}
@Override
public String toString() {//由于题中要输出Student对象,所以Student类重写了toString()方法,快捷键alt+insert
return "学生["+"id="+id+",姓名='"+name+'\''+",年龄="+age+",性别='"+sex+'\''+']';
}
}
StudentEntry类:
package com.jr.test.test05;
public class StudentEntry implements Comparable<StudentEntry>{
private int id;
private Student student;
public StudentEntry(int id,String name,int age,String sex) {
this.id = id;
this.student = new Student(id,name,age,sex);
}
public StudentEntry() {
}
public StudentEntry(int id, Student student) {
this.id = id;
this.student = student;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Override
public String toString() {
return "StudentEntry{" +
"key=" + id +
", value=" + student.toString() +
'}';
}
@Override
public int compareTo(StudentEntry o) {
if (o.getId() == this.getId()){
return 0;
}
if (this.getStudent().getAge() < o.getStudent().getAge()){
return -1;
}else{
return 1;
}
}
}