关于两个集合有相同内容快速查找的方法

本文介绍如何使用Apache Commons Collections库中的CollectionUtils工具类来进行集合的并集、交集、差集等操作,并给出具体示例代码。同时,还提供了一个Struts 2.0框架中EL表达式的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一行代码就可以了,请参考:

List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
list1.add("111");
list1.add("222");
list1.add("222")
list1.add("333");
list2.add("444");
list2.add("222");
list2.add("222");
list2.add("555");

Collection ret = CollectionUtils.intersection(list1, list2);
CollectionUtils--->org.apache.commons.collections.CollectionUtils
原理上是通过将两个collection转换成mapa和mapb,然后两个map再合并到一个set
中,利用set的自身唯一性,然后遍历这个set,看每个set项在两个map中是否存在
找到了则放入返回集合中,关键这个的强大之处是还能返回相同的两个222,
效率应该还可以

org.apache.commons.collections.CollectionUtils

Collection union = CollectionUtils.union( a, b ); //并集
Collection intersection = CollectionUtils.intersection( a, b ); //交集
Collection disjunction = CollectionUtils.disjunction( a, b ); //析取
Collection subtract = CollectionUtils.subtract( a, b ); //差集


0
Struts2.0不支持El表达式,只支持OGNL表达式.
试一下这种形式:
<s:submit value="末页" align="left" action="waitingList" onclick="setPageValue(<s:property value='#request.totalPage'/>);"> </s:submit>

url传递的参数要这样写:${param.参数名}
<think>嗯,用户这次想了解MATLAB中如何快速找出两个集合相同元素。从问题表述看,用户应该有一定MATLAB基础,但可能不熟悉集合操作的相关函数。用户引用的资料里提到了变量操作和数组运算,说明ta更关注基础数据操作方法而非高级应用。之前回答时已经提到过intersect函数,但用户再次提问相同问题,可能有几种情况:一是用户没注意到上次回答的关键信息;二是用户需要更具体的示例说明;三是用户遇到特殊数据类型(如cell或结构体)需要针对性方案。考虑到用户引用的内容涉及工程应用和信号处理,实际数据集可能比较复杂。需要重点强调三个维度:1)基本用法(常规数组);2)特殊数据类型处理(如字符串和矩阵);3)大集合性能优化方案(引用4提到fastcorrelation概念,暗示大数据处理)。特别是大数据场景,应该提一下ismember结合find的优化方案,因为纯intersect在百万级数据时可能较慢。用户没有说明集合数据类型,但引用2提到whos命令,可以建议用户先确认数据类型。另外引用3显示用户可能做信号处理,所以相同元素可能出现在时间序列分析中,示例可以加入实际应用场景。关键点要区分“完全相同元素”和“满足容差的近似相等”,后者在浮点数比较中很重要。引用2提到eps常量,正好可以用来解释容差设置,这个细节很多用户会忽略。</think> 在MATLAB中查找两个集合相同元素(即交集),可直接使用内置函数 `intersect`。以下是具体方法和注意事项: ### 核心函数:`intersect` **语法**: ```matlab C = intersect(A, B) % 返回共同元素(默认排序) [C, ia, ib] = intersect(A, B) % 同时返回索引位置 ``` - **输入**:`A`, `B` 为向量、矩阵或元胞数组 - **输出**: - `C`:有序的交集元素 - `ia`:在A中的索引(满足 `C = A(ia)`) - `ib`:在B中的索引(满足 `C = B(ib)`) ### 应用示例 #### 1. 数值数组交集 ```matlab A = [3, 1, 4, 2]; B = [2, 5, 4, 6]; common = intersect(A, B) % 输出 [2, 4] ``` #### 2. 字符串数组交集 ```matlab strA = ["apple", "banana", "orange"]; strB = ["pear", "banana", "kiwi", "orange"]; commonStr = intersect(strA, strB) % 输出 ["banana", "orange"] ``` #### 3. 获取索引位置 ```matlab A = [10, 20, 30, 40]; B = [20, 50, 40]; [common, idxA, idxB] = intersect(A, B); % common = [20, 40] % idxA = [2, 4] (A中第2/4个元素) % idxB = [1, 3] (B中第1/3个元素) ``` ### 特殊场景处理 1. **浮点数容差** 若数据存在浮点误差,用 `ismembertol` 替代: ```matlab A = [1.0, 2.0001, 3.0]; B = [2.0, 3.001, 4.0]; tol = 1e-3; common = A(ismembertol(A, B, tol)) % 输出 [2.0001, 3.0] ``` 2. **元胞数组比较** 支持字符元胞直接比较: ```matlab cellA = {'red','green','blue'}; cellB = {'yellow','blue','black'}; commonCell = intersect(cellA, cellB) % 输出 {'blue'} ``` ### 性能优化建议 - **大数据集**:预先排序可加速(函数内部自动排序) ```matlab [~, idx] = sort(A); sortedA = A(idx); % 显式排序优化 common = intersect(sortedA, B); ``` - **仅需判断是否相交**:用 `any(ismember(A,B))` 更高效 ### 替代方案(按需选用) - `ismember`:生成逻辑索引(适用子集判断) ```matlab idx = ismember(A, B); % A中属于B的元素返回1 common = A(idx); ``` - `unique` + `ismember`:处理重复元素 ```matlab common = unique(A(ismember(A, B))); ``` > **实践提示**:MATLAB数组默认为列优先存储,行/列向量差异可能导致意外结果,建议统一使用列向量(`A = A(:)`)或通过 `size()` 检查维度 [^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值