List、Map、Set数据的转换并排序的练习题

习题改编:

要求:

实现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方法实现按照年龄排序,输出最后结果。

完整代码在最下面

步骤一:

要求:创建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;
        }
    }
}
  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值