2つのコレクションの一覧から同じ/異なる要素をすばやく見つけます

ただ、最近ニーズの二つの異なるセットから異なる要素を見つけるために、関与、テストコードを以下の

図1に示すように、Apacheの収集ツールの方法を用いて、添付の座標

< 依存> 
    < groupIdを>コモンズ・コレクション</ groupIdを> 
    < たartifactId >コモンズ・コレクション</ たartifactId > 
    < バージョン> 3.2.1 </ バージョン> 
</ 依存関係>

採取キットは、便利なツール2の方法を提供します

1、次のようにorg.apache.commons.collections.ListUtils.retainAll(コレクション、コレクション)ソースを伴う共通の要素を見つけます

    公共の 静的リストがremoveAll(コレクションコレクション、コレクション削除){ 
        リスト一覧 = 新しいArrayListを();
        (イテレータITER = collection.iterator(); iter.hasNext()){ 
            オブジェクトOBJ = iter.next()。
            もし(remove.contains(OBJ)== ){ 
                list.add(OBJ)。
            } 
        } 
        戻り値のリスト。
    }

 

図2は、付随源として異なるエレメントorg.apache.commons.collections.ListUtils.removeAll(コレクション、コレクション)を特定します

    公共の 静的リストのretainAll(コレクションコレクション、コレクションが保持){ 
        リスト一覧 = 新しいArrayListを(Math.min(collection.size()、retain.size())); 

        (イテレータITER = collection.iterator(); iter.hasNext()){ 
            オブジェクトOBJ = iter.next()。
            もし(retain.contains(OBJ)){ 
                list.add(OBJ)。
            } 
        } 
        戻り値のリスト。
    }

テストのデモコードを添付

    パブリック 静的 ボイドメイン(文字列[]引数){
         // 生成集合1 
        一覧<整数> LIST1 = Lists.newArrayList()。
        以下のためにINT I = 0; I <100000; I ++ ){ 
            list1.add(I)。
        } 
        // 生成集合2 
        一覧<整数> LIST2 = Lists.newArrayList()。
        以下のためにINT I = 0; I <100001; I ++ ){ 
            list2.add(I)。
        } 
        長い =開始)(のSystem.currentTimeMillis。
        // 开始分离 
        一覧<整数>リスト=ListUtils.removeAll(LIST2、LIST1)。
        長い端= にSystem.currentTimeMillis(); 
        System.out.println(リスト); 
        System.out.println(終了 - 開始)。
        // 总执行次数100000 * 100001 
    }

次のように実行結果があります

[100000 ]
 4027

有料コードので、以下の最適化と100,000 * 100,001回行い、データの量と、速度が遅く、遅くなり、ソースコード反復プロセスのセットによって見ることができます

    パブリック 静的 ボイドメイン(文字列[]引数){
         // 生成集合1 
        一覧<整数> LIST1 = Lists.newArrayList()。
        以下のためにINT I = 0; I <100000; I ++ ){ 
            list1.add(I)。
        } 
        // 生成集合2 
        一覧<整数> LIST2 = Lists.newArrayList()。
        以下のためにINT I = 0; I <100001; I ++ ){ 
            list2.add(I)。
        } 
        長い =開始)(のSystem.currentTimeMillis。
        // 开始分离 
        地図<整数、整数>マップ= 新しいですHashMapの<整数、整数> ();
        以下のための(整数整数:LIST2){ 
            map.put(整数、 1 )。
        } 
        のための(整数整数:LIST1){ 
            map.put(整数、 2 )。
        } 
        リスト <整数> LIST3 = 新規のArrayList <整数> (); 
        セットの<entry <整数、整数>>のentrySet = map.entrySet()。
        (エントリ<整数、整数> エントリ:のentrySet){ 
            整数値 = entry.getValue()。
            もし(Objects.equals(1 、値)){
                list3.add(entry.getKey()); 
            } 
        } 
        // エンド単離さ
        ロングエンド= ;のSystem.currentTimeMillis()
        のSystem.out.println(LIST3)
        のSystem.out.println(エンド - スタート);
         // 合計実行100000 + 100001 + 100001回 
    }

結果

[100000 ]
 33

、反復回数マッピングを行うことで、繰り返しの回数を減らすためにたくさんの自然アップの速度の違いは非常に明白であり、我々は実行回数を見ることができる分析し、100000 + 100001 + 100001

概要:少量のデータは、まだ非常にListUtils.removeAllの方法が推奨する、すべての後に、ホイールを作成する必要はありませんが、百万人以上のデータ量であれば、地図を使用する場合に推奨される方法

おすすめ

転載: www.cnblogs.com/zhanh247/p/12109114.html