Java 检查两个集合是否包含相同元素的方法,与顺序无关?
假设我有两个不同的Hashset,如下所示。如何检查两个Hashset是否包含相同的元素,并且这两个Hashset是否相等,与集合中元素的顺序无关,请告知Java 检查两个集合是否包含相同元素的方法,与顺序无关?,java,collections,hashset,Java,Collections,Hashset,假设我有两个不同的Hashset,如下所示。如何检查两个Hashset是否包含相同的元素,并且这两个Hashset是否相等,与集合中元素的顺序无关,请告知 Set set1=new HashSet(); set.add(new Emp("Ram","Trainer",34000)); set.add(new Emp("LalRam","Trainer",34000)); 另一个是 Set set2=new HashSet(); set
Set set1=new HashSet();
set.add(new Emp("Ram","Trainer",34000));
set.add(new Emp("LalRam","Trainer",34000));
另一个是
Set set2=new HashSet();
set.add(new Emp("LalRam","Trainer",34000));
set.add(new Emp("Ram","Trainer",34000));
员工pojo是
class Emp //implements Comparable
{
String name,job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
int salary;
public Emp(String n,String j,int sal)
{
name=n;
job=j;
salary=sal;
}
public void display()
{
System.out.println(name+"\t"+job+"\t"+salary);
}
public boolean equals(Object o)
{
Emp p=(Emp)o;
return this.name.equals(p.name)&&this.job.equals(p.job) &&this.salary==p.salary;
}
public int hashCode()
{
return name.hashCode()+job.hashCode()+salary;
}
/* public int compareTo(Object o)
{
Emp e=(Emp)o;
return this.name.compareTo(e.name);
//return this.job.compareTo(e.job);
// return this.salary-e.salary;
}*/
}
假设您已经定义了equals和hashcode,这里有一种方法。对于大型成员来说效率不是很高
int s1 = set1.size();
int s2 = set2.size();
if (s1 !=s2) return false;
return set1.containsAll(set2);
如果希望数据相等,请正确实现
equals()
和hashCode()
,然后可以使用。当然,您需要确保仅当两个集合的元素数相同时才调用此函数,否则您只能说它们不相等。执行以下操作:
setResult = set2.clone();
if ( setResult.retainAll( set1 ) ){
//do something with results, since the collection had differences
}
使用下面的表达式
set1.containsAll(set2) && set2.containsAll(set1)
引用javadoc:
返回true如果给定对象也是一个集合,则这两个集合具有
相同大小,并且给定集合的每个成员都包含在此集合中。
这可以确保equals方法在不同的应用程序中正常工作
Set接口的实现
因此,只需调用set1.equals(set2)
就足够了。当且仅当集合包含相同的元素时(假设您已在集合中的对象上正确定义了equals
和hashCode
),它将返回true
除非出于某种原因需要实现自己的方法,否则只需使用h1.equals(h2)
。下面描述一种可能的实现
public boolean isIdenticalHashSet <A> (HashSet h1, HashSet h2) {
if ( h1.size() != h2.size() ) {
return false;
}
HashSet<A> clone = new HashSet<A>(h2); // just use h2 if you don't need to save the original h2
Iterator it = h1.iterator();
while (it.hasNext() ){
A = it.next();
if (clone.contains(A)){ // replace clone with h2 if not concerned with saving data from h2
clone.remove(A);
} else {
return false;
}
}
return true; // will only return true if sets are equal
}
public boolean-isidentialhashset(HashSet h1,HashSet h2){
如果(h1.size()!=h2.size()){
返回false;
}
HashSet clone=newhashset(h2);//如果不需要保存原始h2,只需使用h2即可
迭代器it=h1.Iterator();
while(it.hasNext()){
A=it.next();
如果(clone.contains(A)){//如果不涉及保存来自h2的数据,则将clone替换为h2
克隆。删除(A);
}否则{
返回false;
}
}
return true;//仅当集合相等时才返回true
}
1-获取一个集合(我们称之为“差异”),其中包含一个集合中有而另一个集合中没有的项-
收集差异=CollectionUtils.subtract(Collection1,Collection2)
2-检查大小==0
如果是-两个集合具有相同的元素;
如果没有-存在一些差异,然后您必须打印“差异”存在的所有项目
不确定是否取决于项目顺序。
我以这种方式比较集合当您不知道集合的类型时,这是一个冗长但(希望)有效的解决方案:
public static <T> boolean equalIgnoreOrder(Collection<T> c1, Collection<T> c2) {
int size1 = c1.size(); // O(1) for most implementations, but we cache for the exceptions.
if (size1 != c2.size()) {
return false;
}
Set<T> set;
Collection<T> other;
if (c1 instanceof Set) {
set = (Set<T>) c1;
other = c2;
} else if (c2 instanceof Set) {
set = (Set<T>) c2;
other = c1;
} else if (size1 < 12 ) { // N^2 operation OK for small N
return c1.containsAll(c2);
} else {
set = new HashSet<>(c1);
other = c2;
}
return set.containsAll(other); // O(N) for sets
}
公共静态布尔值重新排序(集合c1、集合c2){
int size1=c1.size();//O(1)对于大多数实现,但我们缓存例外情况。
如果(size1!=c2.size()){
返回false;
}
集合;
收集其他;
if(集合的c1实例){
set=(set)c1;
其他=c2;
}else if(集合的c2实例){
set=(set)c2;
其他=c1;
}否则,如果(大小1<12){//N^2,则小N的操作正常
返回c1.containsAll(c2);
}否则{
set=新哈希集(c1);
其他=c2;
}
返回set.containsAll(其他);//对于集合为O(N)
}
首先定义“等于”。等于参考值还是等值?如果后者为Emp类定义了equals和hashcode?假设Emp
对equals()
和hashcode()
有适当的覆盖(考虑到它在哈希表中的存在,它可能会这样做),您可以比较集合上的计数,然后尝试将一个集合中的每个元素添加到另一个集合中。如果add()
方法返回true
,则存在差异。这与比较任何其他集合没有区别。请参阅:。虽然这是.net,但java实现应该基本相同。我推荐Daniel Jennings或mbillings的答案,因为我很确定投票率最高的答案违反了微软的使用条款。首先,在集合中讨论元素顺序是没有意义的。集合没有隐式顺序。第二,你还没有明确说明“等于”是什么意思。对于集合,可以是“两个集合包含对实际元素的同一组引用”,或“集合A中的所有元素与集合B中相应的元素进行相等比较(通过equals()
)。你似乎想要后一个定义,这是一个更难实现的问题。这个问题是重复的,正确的答案是:你能发布代码,让理解更清楚吗。。!MJB请您更新完整的代码,使理解更清楚。。!!我想,这比做一个以尺寸检查为前缀的容器要贵。太棒了!我不记得了。如果您只知道在哪里可以找到,那么在标准API中可以找到多少东西,这真是太神奇了。:)不错!不知道等号是为集合定义的!这是正确的答案,比公认的答案简单得多+1.请你把代码贴出来,这样会使理解更清楚。。!这不是一个好答案,下面的答案应该是哈