【JAVA 求差集】

两个list求差集

求差集返回 list字段

/**
 * 差集(基于API解法) 适用于小数据量
 * 求List1中有的但是List2中没有的元素
 * 时间复杂度 O(list1.size() * list2.size())
 */
public static List<String> subList(List<String> list1, List<String> list2) {
    list1.removeAll(list2);
    return list1;
}
 
/**
 * 差集(基于常规解法)优化解法1 适用于中等数据量
 * 求List1中有的但是List2中没有的元素
 * 空间换时间降低时间复杂度
 * 时间复杂度O(Max(list1.size(),list2.size()))
 */
public static List<String> subList1(List<String> list1, List<String> list2) {
    //空间换时间 降低时间复杂度
    Map<String, String> tempMap = new HashMap<>();
    for(String str:list2){
        tempMap.put(str,str);
    }
    //LinkedList 频繁添加删除 也可以ArrayList容量初始化为List1.size(),防止数据量过大时频繁扩容以及数组复制
    List<String> resList = new LinkedList<>();
    for(String str:list1){
        if(!tempMap.containsKey(str)){
            resList.add(str);
        }
    }
    return resList;
}
 
/**
 * 差集(基于java8新特性)优化解法2 适用于大数据量
 * 求List1中有的但是List2中没有的元素
 */
public static List<String> subList2(List<String> list1, List<String> list2) {
    Map<String, String> tempMap = list2.parallelStream().collect(Collectors.toMap(Function.identity(), Function.identity(), (oldData, newData) -> newData));
    return list1.parallelStream().filter(str->{
        return !tempMap.containsKey(str);
    }).collect(Collectors.toList());
}

求差集返回 list对象

 //查询所有的数据 也就是查询数据多的list
List<ApplicationAttributePo> unionAttributePoList = attributeService.attrList(appid, attributenameLike, attributegroupnameLike);
        if (CollectionUtils.isEmpty(unionAttributePoList)) {
            return Collections.emptyList();
        }
        // 去除默认属性  需要过滤掉的list
        List<String> defaultCodeList = attributeService.getDefaultCode();
		//必须要将这个list转为set !!!
        Set<String> codeSet = new HashSet<>(defaultCodeList);
		
		//求unionAttributePoList中有的但是codeSet中没有的元素
        List<ApplicationAttributePo> attributePoList = unionAttributePoList.stream()
                .filter(item -> !codeSet.contains(item.getAttributecode()))
                .collect(Collectors.toList());
		
		//这里是做一个转换
        List<ApplicationAttributeVo> attributeVoList = attributePoList.stream().map(attribute -> {
            ApplicationAttributeVo applicationAttributeVo = new ApplicationAttributeVo();
            BeanUtils.copyProperties(attribute, applicationAttributeVo);
            return applicationAttributeVo;
        }).collect(Collectors.toList());

        return attributeVoList;
    }
03-08
<think>好的,用户现在问的是“差集”,也就是合论中的差集操作。之前他们给出的代码示例使用了Pyclipper库中的CT_DIFFERENCE,所以需要结合之前的上下文来解释。 首先,我需要确认用户的需求。他们可能已经了解了一些Pyclipper的基本操作,现在想深入理解差集的概念及其在代码中的应用。需要明确差集在数学上的定义,以及在几何处理中的具体表现。 接下来,要考虑用户可能的背景。他们可能是在进行图形处理、路径规划或者地理信息系统相关的开发,这些领域常用到多边形布尔运算。用户可能遇到了结果不符合预期的情况,需要理解差集的工作原理来调试代码。 然后,我需要将数学概念与实际代码结合起来。在Pyclipper中,差集操作是从一个多边形(主体)中减去与另一个多边形(裁剪区域)重叠的部分。需要解释清楚参数的作用,比如填充规则PFT_NONZERO的影响,以及路径顺序的重要性。 还要注意用户之前提到的常见问题,比如路径方向错误或浮点数处理,这些可能在差集运算中导致问题。需要提醒用户检查这些方面,确保输入数据的正确性。 此外,用户可能需要示例来直观理解差集的效果。比如,用简单的几何图形说明差集操作前后的变化,或者实际应用场景,如地图导航中剔除禁止区域。 最后,要确保解释清晰,结构合理,使用用户容易理解的语言,避免过于专业的术语,但又要准确无误。同时,保持回答的实用性,让用户能够直接应用这些知识到他们的项目中。</think>以下是关于合运算中**差集**(Set Difference)的详细说明: --- ### **一、数学定义** 差集运算表示为 $A - B$,其结果为: $$A - B = \{x \mid x \in A \ \text{且} \ x \notin B\}$$ #### 几何意义 ![差集示意图](https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Venn0110.svg/240px-Venn0110.svg.png) 从多边形A中**剔除**与多边形B重叠的区域,保留A独有的部分 --- ### **二、Pyclipper 中的实现** 在您提供的代码中: ```python pc2.Execute(pyclipper.CT_DIFFERENCE, ...) ``` - **运算逻辑**: $$result = roi2 - (roi1 \cap roi2)$$ 即从被裁剪对象 `roi2` 中移除与裁剪区域 `roi1` 的重叠部分 - **参数要求**: - `roi1` 必须标记为 `PT_CLIP`(裁剪路径) - `roi2` 必须标记为 `PT_SUBJECT`(主体路径) --- ### **三、典型场景示例** #### 案例:地图区域裁剪 | 原始区域 (roi2) | 裁剪区域 (roi1) | 差集结果 | |----------------|----------------|---------| | ![地图](https://via.placeholder.com/150x150.png?text=地图区域) | ![禁止区](https://via.placeholder.com/150x150.png?text=禁止通行区) | ![结果](https://via.placeholder.com/150x150.png?text=有效区域) | --- ### **四、与其他合运算的对比** | 运算类型 | 数学符号 | Pyclipper 常量 | 效果 | |---------|---------|----------------|------| | 并 | $A \cup B$ | `CT_UNION` | 合并所有区域 | | 交 | $A \cap B$ | `CT_INTERSECTION` | 仅保留重叠区域 | | 差集 | $A - B$ | `CT_DIFFERENCE` | 从A中剔除B的覆盖部分 | | 异或 | $A \oplus B$ | `CT_XOR` | 保留非重叠区域 | --- ### **五、常见问题与调试技巧** 1. **结果为空** - 检查 `roi1` 是否完全包含 `roi2` - 尝试交换裁剪路径和主体路径的角色 2. **路径方向错误** - 使用 `pyclipper.Orientation()` 检测多边形缠绕方向 - 通过 `pyclipper.ReversePath()` 统一调整为顺时针 3. **精度丢失** - Pyclipper 仅支持整数坐标,推荐预处理方案: ```python SCALE_FACTOR = 1000 # 根据实际精度需求调整 scaled_roi = [(int(x*SCALE_FACTOR), int(y*SCALE_FACTOR)) for (x,y) in original_roi] ``` --- ### **六、高级应用** 在三维打印中,差集运算可用于生成**镂空结构**: ```python # 创建实体立方体 solid_cube = [...] # 创建空心圆柱体 hollow_cylinder = [...] # 执行差集运算生成带孔洞的模型 pc.AddPath(solid_cube, pyclipper.PT_SUBJECT) pc.AddPath(hollow_cylinder, pyclipper.PT_CLIP) result = pc.Execute(pyclipper.CT_DIFFERENCE) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值