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);
                }

            }
        }

    }
}

最近項目在拆分微服務,所以此類操作更加多了,也就有了更多的可以練手的機會,開心。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章