第二种:使用list中的retainAll方法
java 取交集方法retainAll
有两个集合A和B,判断这两个集合是否包含相同的对象或元素,可以使用retainAll方法:A.retainAll(B)。如果存在相同元素,A仅保留相同的元素。如果不存在相同元素,A会变为空。
总的来说:如果集合A和集合B是完全相同的集合,也会返回false。两个集合没有交集,才会返回true
第三种:使用md5的加密算法(可以了解,最好不要使用,比第一种循环比较还慢)
String str = SecureUtil.md5(list.toString());
String str1 = SecureUtil.md5(list1.toString());
return str.equals(str1);
第四种:java8的stream流
return list.stream().sorted().collect(Collectors.joining())
.equals(list1.stream().sorted().collect(Collectors.joining()));
第五种:使用list自带的sort方法先进性排序,然后转成toString去判断两个集合是否相等(
速度最优,推荐使用
)
list.sort(Comparator.comparing(String::hashCode));
list1.sort(Comparator.comparing(String::hashCode));
return list.toString().equals(list1.toString());
public static boolean isSameCollections(List<String> list1,List<String>list2){
String listToStr1 = list1.stream().col..
利用
JAVA
反射机制获取到类、所有字段、所有方法、字段值来进行比较,
两个
List实体遍历进行比较,
判断
内容
是否
完全
相同。一封装好工具类,调用者只需一行代码即可
判断
是否
相等
,接收泛型
Java
接口定义disjoint(Collection> c1, Collection> c2) 方法返回true表示
两个
collection中没有相同的
元素
。disjoint()方法不需要传入类型相同的
集合
,只要实现collection接口即可。如果 c1
集合
和 c2
集合
没有相同
元素
返回true。如果传入参数为 null 会引发空指针异常。disjoint在
判断
过程中对执行速度...
比较
两个
集合
是否
存在交集就可以了:于是我们马上就能能想到的方法:通过for循环逐
个元素
比较,遇到相同返回有相同的结果;我们也可以通过小名在之前文章提到的lambda表达式提高性能,等。今天小名想分享给大家的是来自“万能的Collections”中的一个静态方法顾名思义,它是用来
判断
两个
集合
"不相交的”的结果,但我们只要对返回结果取反,就可以高效获得我们想要的结果。
一,实现1. 最简单粗暴的方法,遍历循环1 packagelist.demo;23 import
java
.io.Serializable;4 import
java
.util.*;5 import
java
.util.stream.Collectors;67 /**8 *
判断
两个
集合
是否
相等
9 */10 public class CheckDiffList implementsSerializ...
Boolean boolean =Collections.disjoint(Collection<?> c1, Collection<?> c2)
1.方法返回true表示
两个
集合
中没有相同的
元素
。
2.disjoint()方法不需要传入类型相同的
集合
,只要实现collection接口即可。如果 c1
集合
和 c2
集合
没有相同
元素
返回true。如果传入参数为 null 会引发空指针异常。
3.disjoint在
判断
过程中对执行速度做了优化,因此比我们直接遍历
两个
li
求交集和并集的线性算法(原创)
对于给定的
两个
集合
,使用哈希表可以在线性时间复杂度内得到他们的交集和并集,具体说明如下:
假设有
集合
A={1, 7, 5, 13, 9, 10, 11}, B={5, 7, 10, 1, 18, 12},
1)求交集,需要得到结果:A∩B={1, 5, 7,10}
思路如下:
①建立一个哈希表(HashTable),其键(KEY)表示
集合
中数字的值,其值(VALUE)表示
集合
中数字出现的次数
②遍历
集合
A,将
集合
中的每个数字(KEY)插入哈希表,每个数字的出现次数(VALUE)设置为1
③遍历
集合
B,对于
集合
中的每个数字:
如果哈希表中已经存在该数字,将对应的VALUE改为2
如果哈希表中不存在该数字,忽略
④遍历哈希表,输出VALUE为2的数字,即得到A和B的交集
2) 求并集,需要得到结果:AUB={1,5,7,9,10,11,12,13,18}
思路如下:
①建立一个哈希表(HashTable),其键(KEY)表示
集合
中数字的值,其值(VALUE)可以无视
②遍历
集合
A,将
集合
中的每个数字(KEY)插入哈希表
③遍历
集合
B,对于
集合
中的每个数字:
如果哈希表中已经存在该数字,忽略
如果哈希表中不存在该数字,将这个数字插入哈希表
④遍历哈希表,输出哈希表中的每个KEY,即为A和B的并集
上面以
两个
集合
为例说明了交集和并集的求法,事实上,上述算法可以很方便的扩展到3个或3个以上的
集合
的求交集和求并集。另外求并集时,由于哈希表的值(VALUE)部分不需要用到,所以这个数据结构也可以更换为
哈希集(HashSet)。
转载请注明出处。
VB中HashTable
2012-08-20 14:43:21| 分类: asp.net|举报|字号 订阅
首先定义一个hashtable
Dim hstl As New Hashtable
hstl.Add(key, value) '
java
是用.put MS开始全面模仿
java
这说说vb.net中的hashtable基本用法:
添加值:hstl.add(key,value)
通过key取值: hstl.Item(key).ToString
判断
是否
含有Key: ContainsKey(key)
判断
是否
含有value: ContainsValue(value)
遍历hashtable:
Dim de As DictionaryEntry '泛型类
For Each de In hstl
console.write(de.key & de.value)
Next de
hashtable不支持通过value取key.
求2个
集合
的交集
第一种方法
最简单、粗暴的循环遍历2个
集合
,
判断
如果有相同的
元素
就取出来。假设
集合
1的长度为M,
集合
2的长度为N,那么,时间复杂度为:O(M*N)
public static List<string> GetIntersection(List<string> list1, List<string> list2)
List<string> list3 = new List<string>();
//第一种方法:循环遍历
//O(n×m)
for (int i = 0; i < list1.Count; i++)
for (int j = 0; j < list2.Count; j++)
if (list1[i]==list2[j])
list3.Add(list1[i]);
return list3;
第二种方法
利用hash这种很有用的数据结构来实现。我们知道,hash的特点之一就是不允许有重复
元素
,即hash表中的
元素
都是唯一的。所以,我们的思路就是:先把第一个
集合
的所有
元素
都放进hashSet中,时间复杂度O(M);再把第二个
集合
中的
元素
放进hashSet中,如果有重复
元素
,就是这2个
集合
的交集,时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。
public static List<string> GetIntersection2(List<string> list1, List<string> list2)
//第二种方法:hash
List<string> list3 = new List<string>();
HashSet<string> hashSet = new HashSet<string>();
foreach (string item in list1)
hashSet.Add(item);
foreach (string item in list2)
if (hashSet.Add(item) == false)
list3.Add(item);
return list3;
static void Main(string[] args)
List<string> list1 = new List<string>();
list1.Add("apple");
list1.Add("banana");
list1.Add("pear");
list1.Add("orange");
list1.Add("grape");
List<string> list2 = new List<string>();
list2.Add("nokia");
list2.Add("sumsung");
list2.Add("htc");
list2.Add("apple");
list2.Add("orange");
List<string> list =new List<string>();
//test for two set join
//list = TwoSetsIntersection.GetIntersection(list1, list2);
list = TwoSetsIntersection.GetIntersection2(list1, list2);
foreach (string item in list)
Console.Write(item + "\t");
hash的另一个特点是查找效率为O(1),惊人的高!
对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。
HashSet<T>类
HashSet<T>类主要是设计用来做高性能集运算的,例如对
两个
集合
求交集、并集、差集等。
集合
中包含一组不重复出现且无特性顺序的
元素
。
HashSet<T>的一些特性如下:
1、HashSet<T>中的值不能重复且没有顺序。
2、HashSet<T>的容量会按需自动添加。
构造方法:
HashSet() 默认
相等
比较器创建一个空的新实例。
HashSet(IEnumerable<T> collection) 把指定
集合
中的collection中的数据复制到集中
HashSet(IEqualityComparer<T> comparer) 使用指定的
相等
比较器创建一个空的新实例
HashSet(IEnumerable<T> collection,IEqualityComparer<T> comparer) 使用指定的比较器实例化数据,且将指定
集合
中的
元素
复制到
集合
中。
因为HashSet<T>是专门设计来做
集合
运算的,因此它提供的方法中有不少是和
集合
运算相关的。
以下给出它的一些常用方法介绍
成员 类型 说明
Add 方法 将指定的
元素
添加到
集合
中
Clear 方法 清空
集合
中的所有
元素
Contains 方法 确定某
元素
是否
在HashSet<T>中
Exists 方法 确定HashSet<T>
是否
包含于指定条件相匹配的
元素
ExceptWith 方法 从当前HashSet<T>移除指定
集合
中的所有
元素
IntersectWith 方法 修改当前的HashSet<T>对象,以仅包含该对象和指定
集合
中存在的
元素
IsProperSubsetOf 方法 确定HashSet<T>对象
是否
为指定
集合
的真子集
IsProperSupersetOf 方法 确定HashSet<T>对象
是否
为指定
集合
的真超集
IsSunsetOf 方法 确定HashSet<T>对象
是否
为指定
集合
的子集
IsSupersetOf 方法 确定HashSet<T>对象
是否
为指定
集合
的超集
Remove 方法 从HashSet<T>对象中移除指定的
元素
RemoveWhere 方法 从HashSet<T>
集合
中移除与指定谓词所定义的条件相匹配的所有
元素
SetEquals 方法 确定HashSet<T>对象与指定的
集合
中
是否
包含相同的
元素
SynmmetricExceptWith 方法 修改当前的HashSet<T>对象,以仅包含该对象或指定
集合
中存在的
元素
TrimExcess 方法 将HashSet<T>对象的容量设置为它所包含的
元素
的实际个数,向上舍入为接近的特性与实现的值。
UnionWith 方法 修改当前的HashSet<T>对象,以包含该对象本身和指定
集合
中存在的所有
元素
给个简单的例子,写不完的,总之记得HashSet<T>主要的作用是用来进行,交集、并集等运算的就OK了。
static void Main(string[] args)
HashSet<string> hs = new HashSet<string>();
hs.Add("你");
hs.Add("好");
hs.Add("吗");
HashSet<string> hs1 = new HashSet<string>();
hs1.Add("你");
hs1.Add("好");
bool b = hs1.IsProperSubsetOf(hs); //确定hs1
是否
是hs的真子集
Console.WriteLine(b); //输出True
HashSet<string> hs2 = new HashSet<string>();
hs2.Add("爱你");
IEnumerable<string> list = hs.Union(hs2); //返回并集
foreach (string str in list)
Console.WriteLine(str); //输出 你 好 吗 爱你
Console.ReadKey();