> Java > Java시작하기 > 본문

Java에서 두 세트 사이에 교집합이 있는지 확인하는 방법

王林
풀어 주다: 2020-11-20 15:13:58
앞으로
16520명이 탐색했습니다.

Java에서 두 세트 사이에 교집합이 있는지 확인하는 방법

배경:

프런트엔드는 목록 컬렉션을 전달하고 백엔드 필드도 (1,2,3,4) 형식입니다. SQL을 사용하지 않고 프런트 엔드에서 전달한 집합이 백엔드 필드 집합에 있는지 어떻게 확인합니까?

(학습영상 공유 : java 교육영상)

Code :

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)

Origin에 Collection C에 없는 데이터가 있는 경우 , false를 반환합니다. true가 반환되지 않습니다

동시에 원본 세트가 변경되고 두 세트의 동일한 데이터만 유지됩니다. 즉, 원본 세트에서 데이터가 삭제되어 false가 반환됩니다

그래서 확인하는 방법은 무엇입니까? 교차로가 있는지?

1. 두 세트 중 어느 것도 동일하지 않고 원점은 비어 있으며 반환 값은 false입니다.

2. 우연히 두 세트의 원점 데이터는 모두 c에 있고 원점은 변경되지 않고 반환됩니다. value is true

이 두 가지 특별한 상황은 단순히 반환 값 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에서 두 세트 사이에 교집합이 있는지 확인하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿