배경:
프런트엔드는 목록 컬렉션을 전달하고 백엔드 필드도 (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 중국어 웹사이트의 기타 관련 기사를 참조하세요!