map集合解决双重for循环的性能问题

现在有个需求,需要将student表和class表的所有数据返回回去,关联条件时class_id。如果用sql很容易实现,直接连表查询就可以了,但是现在项目是微服务,不能连表查询了,所以得在代码里面修改。

定义三个类,student类,class类,还有返回所有数据的studentAndClass类。

import java.util.ArrayList;
import java.util.List;

/**
 * Created by 郝雨烁 on 2019/12/1.
 */
public class Student {

    private Integer id;
    private  String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getClassId() {
        return classId;
    }

    public void setClassId(Integer classId) {
        this.classId = classId;
    }

    private  Integer classId;

    public Student(Integer id, String name, Integer classId) {
        this.id = id;
        this.name = name;
        this.classId = classId;
    }

    @Override
    public String toString() {
        return super.toString();
    }
}
/**
 * Created by 郝雨烁 on 2019/12/2.
 */
public class Class {
    private Integer classId;
    private String className;

    public Integer getClassId() {
        return classId;
    }

    public void setClassId(Integer classId) {
        this.classId = classId;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public Class(Integer classId, String className) {
        this.classId = classId;
        this.className = className;
    }

    @Override
    public String toString() {
        return super.toString();
    }
}

数据组装代码如下 

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        Student student = new Student(1,"小明",1);
        Student student1= new Student(2,"小红",2);
        studentList.add(student);
        studentList.add(student1);
        List<Class> classList = new ArrayList<>();
       Class cl = new Class(1,"1班");
       Class c2 = new Class(2,"2班");

        classList.add(cl);
        classList.add(c2);
        List<StudentAndClass> list = new ArrayList<>();
        for (Student studentArray : studentList) {
            for (Class aClass : classList) {
                if(studentArray.getClassId().equals(aClass.getClassId())){
                    StudentAndClass studentAndClass = new StudentAndClass();
                    studentAndClass.setClassId(studentArray.getClassId());
                    studentAndClass.setClassName(aClass.getClassName());
                    studentAndClass.setId(studentArray.getId());
                    studentAndClass.setName(studentArray.getName());
                    list.add(studentAndClass);
                }
            }

        }

    }
}

双层for循环,此时时间复杂度是n2.

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        Student student = new Student(1,"小明",1);
        Student student1= new Student(2,"小红",2);
        studentList.add(student);
        studentList.add(student1);
        List<Class> classList = new ArrayList<>();
       Class cl = new Class(1,"1班");
       Class c2 = new Class(2,"2班");
        classList.add(cl);
        classList.add(c2);
        // list 转成map,map存放的是key和value的映射关系
        Map<Integer,Class> map = new HashMap<>();
        for (Class aClass : classList) {
            map.put(aClass.getClassId(),aClass);
        }
        List<StudentAndClass> list = new ArrayList<>();
        if(studentList.size()>0){
            for (Student studentArray : studentList) {
                Class c1= map.get(studentArray.getClassId());
                if(c1!=null){
                    StudentAndClass studentAndClass = new StudentAndClass();
                    studentAndClass.setClassId(studentArray.getClassId());
                    studentAndClass.setClassName(c1.getClassName());
                    studentAndClass.setId(studentArray.getId());
                    studentAndClass.setName(studentArray.getName());
                    list.add(studentAndClass);
                }

            }
        }


    }

将其中一个list转成map之后就成了并列for循环。此时时间复杂度成了n。

lamda表达式解决list转map问题更加方便了,一句代码解决三句代码才解决的问题。

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        List<Student> studentList = new ArrayList<>();
        Student student = new Student(1,"小明",1);
        Student student1= new Student(2,"小红",2);
        studentList.add(student);
        studentList.add(student1);
        List<Class> classList = new ArrayList<>();
       Class cl = new Class(1,"1班");
       Class c2 = new Class(2,"2班");
        classList.add(cl);
        classList.add(c2);
        // list 转成map,map存放的是key和value的映射关系
//        Map<Integer,Class> map = new HashMap<>();
//        for (Class aClass : classList) {
//            map.put(aClass.getClassId(),aClass);
//        }
        Map<Integer, Class> map = classList.stream().collect(Collectors.toMap(Class::getClassId, e -> e));
        List<StudentAndClass> list = new ArrayList<>();
        if(studentList.size()>0){
            for (Student studentArray : studentList) {
                Class c1= map.get(studentArray.getClassId());
                if(c1!=null){
                    StudentAndClass studentAndClass = new StudentAndClass();
                    studentAndClass.setClassId(studentArray.getClassId());
                    studentAndClass.setClassName(c1.getClassName());
                    studentAndClass.setId(studentArray.getId());
                    studentAndClass.setName(studentArray.getName());
                    list.add(studentAndClass);
                }

            }
        }

    }
}

最近项目在拆分微服务,所以此类操作更加多了,也就有了更多的可以练手的机会,开心。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值