国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何從兩個List中篩選出相同的值

BothEyes1993 / 3633人閱讀

摘要:轉(zhuǎn)換為社保卡和,從二者中找出匹配的社保卡。準(zhǔn)備初始化數(shù)據(jù)小明小紅小王小目標(biāo)從中篩選出中存在的卡片遍歷很容易看出,時間復(fù)雜度采用通過觀察發(fā)現(xiàn),兩個取相同的部分時,每次都遍歷兩個。

問題

現(xiàn)有社保卡和身份證若干,想要匹配篩選出一一對應(yīng)的社保卡和身份證。
轉(zhuǎn)換為List<社保卡> socialList,和List idList,從二者中找出匹配的社保卡。

模型

創(chuàng)建社保卡類

/**
 * @author Ryan Miao
 */
class SocialSecurity{
    private Integer id;//社保號碼
    private Integer idCard;//身份證號碼
    private String somethingElse;

    public SocialSecurity(Integer id, Integer idCard, String somethingElse) {
        this.id = id;
        this.idCard = idCard;
        this.somethingElse = somethingElse;
    }

    public Integer getId() {
        return id;
    }

    public Integer getIdCard() {
        return idCard;
    }

    public String getSomethingElse() {
        return somethingElse;
    }

    @Override
    public String toString() {
        return "SocialSecurity{" +
                "id=" + id +
                ", idCard=" + idCard +
                ", somethingElse="" + somethingElse + """ +
                "}";
    }
}

創(chuàng)建身份證類

class IdCard {
    private Integer id;//身份證號碼
    private String somethingElse;

    public IdCard(Integer id, String somethingElse) {
        this.id = id;
        this.somethingElse = somethingElse;
    }

    public Integer getId() {
        return id;
    }

    public String getSomethingElse() {
        return somethingElse;
    }

    @Override
    public String toString() {
        return "IdCard{" +
                "id=" + id +
                ", somethingElse="" + somethingElse + """ +
                "}";
    }
}
最簡單的辦法:遍歷

只要做兩輪循環(huán)即可。
準(zhǔn)備初始化數(shù)據(jù):


private ArrayList socialSecurities;
private ArrayList idCards;

@Before
public void setUp(){
    socialSecurities = Lists.newArrayList(
            new SocialSecurity(1, 12, "小明"),
            new SocialSecurity(2, 13, "小紅"),
            new SocialSecurity(3, 14, "小王"),
            new SocialSecurity(4, 15, "小peng")
    );

    idCards = Lists.newArrayList(
            new IdCard(14, "xiaopeng"),
    new IdCard(13, "xiaohong"),
    new IdCard(12, "xiaoming")
    );

    //目標(biāo): 從socialSecurities中篩選出idCards中存在的卡片
}

遍歷

 @Test
public void testFilterForEach(){
    List result = new ArrayList<>();
    int count = 0;
    for (SocialSecurity socialSecurity : socialSecurities) {
        for (IdCard idCard : idCards) {
            count++;
            if (socialSecurity.getIdCard().equals(idCard.getId())){
                result.add(socialSecurity);
            }
        }
    }

    System.out.println(result);
    System.out.println(count);//12 = 3 * 4
    //O(m,n) = m*n;
}

很容易看出,時間復(fù)雜度O(m,n)=m*n.

采用Hash

通過觀察發(fā)現(xiàn),兩個list取相同的部分時,每次都遍歷兩個list。那么,可以把判斷條件放入Hash中,判斷hash是否存在來代替遍歷查找。

@Test
public void testFilterHash(){
    Set ids = idCards
            .stream()
            .map(IdCard::getId)
            .collect(Collectors.toSet());
    List result = socialSecurities
            .stream()
            .filter(e->ids.contains(e.getIdCard()))
            .collect(Collectors.toList());

    System.out.println(result);
    //初始化 hash 3
    //遍歷socialSecurities 4
    //從hash中判斷key是否存在  4
    //O(m,n)=2m+n=11
}

如此,假設(shè)hash算法特別好,hash的時間復(fù)雜度為O(n)=n。如此推出這種做法的時間復(fù)雜度為O(m,n)=2m+n. 當(dāng)然,更重要的是這種寫法更讓人喜歡,天然不喜歡嵌套的判斷,喜歡扁平化的風(fēng)格。

Hash一定會比遍歷快嗎

想當(dāng)然的以為,hash肯定會比遍歷快,因為是hash啊。其實,可以算算比較結(jié)果。比較什么時候2m+n < m*n
從數(shù)據(jù)歸納法的角度,n必須大于2,不然即演變程2m+2 < 2m。于是,當(dāng)n>2時:

@Test
public void testCondition(){
    int maxN = 0;
    for (int m = 2; m < 100; m++) {
        for (int n = 3; n < 100; n++) {
            if ((2*m+n)>m*n){
                System.out.println("m="+m +",n="+n);
                if (n>maxN){
                    maxN = n;
                }
            }
        }
    }

    System.out.println(maxN);
}

結(jié)果是:

m=2,n=3
3

也就是說n<=3的時候,遍歷要比hash快。事實上還要更快,因為hash還需要創(chuàng)建更多的對象。然而,大部分情況下,n也就是第二個數(shù)組的長度是大于3的。這就是為什么說hash要更好寫。當(dāng)然,另一個很重要的原因是lambda stream的運算符號遠(yuǎn)比嵌套循環(huán)讓人喜愛。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67645.html

相關(guān)文章

  • 零開始構(gòu)造決策樹(python)

    摘要:起步本章介紹如何不利用第三方庫,僅用自帶的標(biāo)準(zhǔn)庫來構(gòu)造一個決策樹。構(gòu)造決策樹決策樹中需要一個屬性來指向樹的根節(jié)點,以及特征數(shù)量。 起步 本章介紹如何不利用第三方庫,僅用python自帶的標(biāo)準(zhǔn)庫來構(gòu)造一個決策樹。不過這可能需要你之前閱讀過這方面的知識。 前置閱讀 分類算法之決策樹(理論篇) 分類算法之決策樹(應(yīng)用篇) 本文使用將使用《應(yīng)用篇》中的訓(xùn)練集,向量特征僅有 0 和 1 兩種情況...

    zhoutao 評論0 收藏0
  • 如何管理 vue 項目中的數(shù)據(jù)?

    摘要:如何管理項目的數(shù)據(jù)這個問題似乎早已經(jīng)有答案了,無非就是使用,全局,整個應(yīng)用維護(hù)一個超大的,界面的顯示情況隨著超大的變化而變化。 vuex 如何管理 vue 項目的數(shù)據(jù)?這個問題似乎早已經(jīng)有答案了,無非就是使用 vuex ,全局 store,整個應(yīng)用維護(hù)一個超大的 Object,界面的顯示情況隨著超大 Object 的變化而變化。 看起來很簡單,不就維護(hù)一個 Object 嘛,實際上,要...

    starsfun 評論0 收藏0
  • Python編程規(guī)范筆記(上)

    摘要:編程規(guī)范筆記上寫在前面從語言開始,自己陸續(xù)學(xué)習(xí)了,但是自從研究生做畢設(shè)接觸以來,就愛不釋手,再也沒有動力嘗試其他語言。一與的一大優(yōu)勢就是具備優(yōu)秀的可讀性,而這基于一套較為完整的公認(rèn)編程規(guī)范。如原本希望的結(jié)果是,結(jié)果卻完全一樣。 Python編程規(guī)范筆記(上) 寫在前面: 從C語言開始,自己陸續(xù)學(xué)習(xí)了C++/Java,但是自從研究生做畢設(shè)接觸Python以來,就愛不釋手,再也沒有動力嘗試...

    Kross 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<