Javaで2つのコレクション間に交差があるかどうかを判断する方法

王林
リリース: 2020-11-20 15:13:58
転載
16418 人が閲覧しました

Javaで2つのコレクション間に交差があるかどうかを判断する方法

バックグラウンド:

フロントエンドはリスト コレクションを渡し、バックエンド フィールドも (1,2,3,4) の形式になります。 。 SQLを使用せずに、フロントエンドによって渡されたセットがバックエンドフィールドのセットにあるかどうかを確認するにはどうすればよいですか?

(学習ビデオ共有: java 教育ビデオ)

コード:

public static boolean judgeIntersection(List<String> list1,List<String> list2){
    boolean flag = false;
    // 使用retainAll会改变list1的值,所以写一个替代
    List<String> origin = new ArrayList<>();
    origin.addAll(list1);
    origin.retainAll(list2);
    // 有交集
    if(origin.size()>0){
        flag = true;
    }
    return flag;
}
ログイン後にコピー

boolean flag = Origin.retainAll(Collection

セット C にないデータがオリジンにある場合は、false を返します。 true は返されません。

同時に、元のセットが変更され、2 つのセットの同じデータのみが保持されます。つまり、元のセットはデータを削除しており、false が返されます。

交差点があるかどうかを判断するにはどうすればよいですか?

1. 2 つのセット、どれも同じではありません、origin は空、戻り値は false

2. 2 つのセット、偶然、origin のデータはすべて c にあります、origin 変更なし、戻り値は true です。

これら 2 つの特殊なケースは、単に戻り値の true または false に依存するだけでは交差を判断することが不可能であるという事実につながります。したがって、オリジン コレクションの数 >0 に応じて、交差が存在します

##retainAll(Collection c) ソース コード

public boolean retainAll(Collection<?> c) {
        // 判断c集合是否为空
        Objects.requireNonNull(c);
        return batchRemove(c, true);
    }
 
    private boolean batchRemove(Collection<?> c, boolean complement) {
        // 得到调用该函数的集合。因为是引用类型,所以修改了都会有变化
        final Object[] elementData = this.elementData;
        // w:记录交集的数据都放到elementData前面,w是其位置分界线
        int r = 0, w = 0;
        // 返回值 用于判断elementData有没有被修改
        boolean modified = false;
        try {
            // 循环elementData集合,判断其中元素是否在c集合中
            for (; r < size; r++)
                // 若在集合中,则w自增,并将该值放到elementData[w]中,即是交集的数据都放到集合的前面
                if (c.contains(elementData[r]) == complement)
                    elementData[w++] = elementData[r];
        } finally {
            // Preserve behavioral compatibility with AbstractCollection,
            // even if c.contains() throws.
            // 正常情况下,经过上面的循环,r==size。为防止出现循环异常,将由于异常导致的r到size是交集的数据但并没有放到对应w的位置的数据,都放到对应w之后的位置上
            if (r != size) {
                System.arraycopy(elementData, r,
                                 elementData, w,
                                 size - r);
                w += size - r;
            }
            // 若elementData中有数据不在c集合中,就清理掉w位置之后的数据,便于垃圾回收
            if (w != size) {
                // clear to let GC do its work
                for (int i = w; i < size; i++)
                    elementData[i] = null;
                // 记录elementData集合被增删的次数,这里是删除
                modCount += size - w;
                // 赋值最新的size
                size = w;
                // elementData集合被清理,modified为true
                modified = true;
            }
        }
        return modified;
    }
ログイン後にコピー
関連する推奨事項:

Java 入門チュートリアル #

以上がJavaで2つのコレクション間に交差があるかどうかを判断する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:csdn.net
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!