成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

如何從兩個(gè)List中篩選出相同的值

BothEyes1993 / 3688人閱讀

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

問題

現(xiàn)有社??ê蜕矸葑C若干,想要匹配篩選出一一對(duì)應(yīng)的社??ê蜕矸葑C。
轉(zhuǎn)換為L(zhǎng)ist<社??? socialList,和List idList,從二者中找出匹配的社保卡。

模型

創(chuàng)建社???/p>

/**
 * @author Ryan Miao
 */
class SocialSecurity{
    private Integer id;//社保號(hào)碼
    private Integer idCard;//身份證號(hào)碼
    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;//身份證號(hào)碼
    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 + """ +
                "}";
    }
}
最簡(jiǎn)單的辦法:遍歷

只要做兩輪循環(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;
}

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

采用Hash

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

@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的時(shí)間復(fù)雜度為O(n)=n。如此推出這種做法的時(shí)間復(fù)雜度為O(m,n)=2m+n. 當(dāng)然,更重要的是這種寫法更讓人喜歡,天然不喜歡嵌套的判斷,喜歡扁平化的風(fēng)格。

Hash一定會(huì)比遍歷快嗎

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

@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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/67645.html

相關(guān)文章

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

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

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

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

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

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

    Kross 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<