【Java】兩個 List 遍歷匹配數據的優化處理


軟件測試技術交流羣 : 429183023 

首先,舉個例子:例如有一個List<Student>,另外一個是List<Husband>,你現在要篩選出來自同一個家庭的丈夫和妻子,組成一個家庭的數據全集(一個家庭包含丈夫、妻子),這樣就是吧數據賦值給另外一個List<Family>(這個例子可能不恰當,歡迎評論給出更好的例子);

說明:代碼採用java8的Stream和Lambda處理List,如果對Stream和Lambda不太瞭解的,先查閱另外一篇文章:http://blog.csdn.net/qi_lin7/article/details/52958123

好吧,大家還是結合代碼來看吧

Wife.java
import java.io.Serializable;

/**
 * Author: 
 * Date: 2016/11/23.
 * Time: 18:08
 */
public class Wife implements Serializable {
    private int id;
    /**妻子名字**/
    private String wifeName;
    /**家庭ID**/
    private String familyId;

    public Wife() {

    }

    public Wife(int id, String wifeName, String familyId) {
        this.id = id;
        this.wifeName = wifeName;
        this.familyId = familyId;
    }

    public int getId() {
        return id;
    }

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

    public String getWifeName() {
        return wifeName;
    }

    public void setWifeName(String wifeName) {
        this.wifeName = wifeName;
    }

    public String getFamilyId() {
        return familyId;
    }

    public void setFamilyId(String familyId) {
        this.familyId = familyId;
    }

    @Override
    public String toString() {
        return "";
    }
}

Husband.java
import java.io.Serializable;

/**
 * Author: 
 * Date: 2016/11/23.
 * Time: 18:08
 */
public class Husband implements Serializable {
    private int id;
    /**丈夫名字**/
    private String husbandName;
    /**家庭ID**/
    private String familyId;

    public int getId() {
        return id;
    }

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

    public Husband(){
        
    }

    public Husband(int id, String wifeName, String familyId) {
        this.id = id;
        this.husbandName = wifeName;
        this.familyId = familyId;
    }

    public String getHusbandName() {
        return husbandName;
    }

    public void setHusbandName(String husbandName) {
        this.husbandName = husbandName;
    }

    public String getFamilyId() {
        return familyId;
    }

    public void setFamilyId(String familyId) {
        this.familyId = familyId;
    }

    @Override
    public String toString() {
        return "";
    }
}

Family.java
import java.io.Serializable;

/**
 * Author: 
 * Date: 2016/11/23.
 * Time: 18:08
 */
public class Family implements Serializable {
    /**妻子名字**/
    private String wifeName;
    /**丈夫名字**/
    private String husbandName;
    /**家庭ID**/
    private String familyId;

    public String getWifeName() {
        return wifeName;
    }

    public void setWifeName(String wifeName) {
        this.wifeName = wifeName;
    }

    public String getHusbandName() {
        return husbandName;
    }

    public void setHusbandName(String husbandName) {
        this.husbandName = husbandName;
    }

    public String getFamilyId() {
        return familyId;
    }

    public void setFamilyId(String familyId) {
        this.familyId = familyId;
    }

    @Override
    public String toString() {
        return "";
    }
}

TestFamily.java
import com.xxx.bean.Family;
import com.xxx.bean.Husband;
import com.xxx.bean.Wife;
import com.google.common.collect.Lists;
import org.junit.Test;

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

/**
 * Author: 
 * Date: 2016/11/23.
 * Time: 18:17
 */
public class TestFamily {
    @Test
    public void familyTest() {
        List<Wife> wife = Lists.newArrayList();
        wife.add(new Wife(0, "我是張三的妻子", "0001"));
        wife.add(new Wife(0, "我是李四的妻子", "0002"));
        wife.add(new Wife(0, "我是王五的妻子", "0003"));

        List<Husband> husband = Lists.newArrayList();
        husband.add(new Husband(0, "我是張三", "0001"));
        husband.add(new Husband(0, "我是李四", "0002"));
        husband.add(new Husband(0, "我是王五", "0003"));

        List<Family> families = Lists.newArrayList();
        // 將list轉爲Map,這裏key一定要爲唯一值
        Map<String, Wife> wifeMap = wife.stream().collect(
                Collectors.toMap(w -> w.getFamilyId(),
                        w -> w));
        // 匹配家庭
        families = husband.stream().map(h -> {
            return toFamily(wifeMap.get(h.getFamilyId()), h);
        }).collect(Collectors.toList());

        families.stream().forEach(family -> {
            System.out.println("家庭ID:" + family.getFamilyId() + ",丈夫:" + family.getHusbandName() + ",妻子:" + family.getWifeName());
        });
    }

    private Family toFamily(Wife wife, Husband husband) {
        Family family = new Family();
        family.setFamilyId(wife.getFamilyId());
        family.setHusbandName(husband.getHusbandName());
        family.setWifeName(wife.getWifeName());
        return family;
    }
}


最後輸出結果:

家庭ID:0001,丈夫:我是張三,妻子:我是張三的妻子
家庭ID:0002,丈夫:我是李四,妻子:我是李四的妻子
家庭ID:0003,丈夫:我是王五,妻子:我是王五的妻子

這種處理辦法,可以將處理此類問題的循環次數由N*N,變爲2*N

如果不理解或者有更好的解決辦法處理此類問題的















發佈了15 篇原創文章 · 獲贊 35 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章