Java 集合交叉点
我想将INTERAction(使用此方法)应用于包含非基元对象的集合。我写了这段代码,但我知道交叉口是空的Java 集合交叉点,java,set,Java,Set,我想将INTERAction(使用此方法)应用于包含非基元对象的集合。我写了这段代码,但我知道交叉口是空的 Concept a = new Concept("Dog"); Concept b = new Concept("Tree"); Concept c= new Concept("Dog"); HashSet<Concept> set_1 = new HashSet<Concept>();
Concept a = new Concept("Dog");
Concept b = new Concept("Tree");
Concept c= new Concept("Dog");
HashSet<Concept> set_1 = new HashSet<Concept>();
HashSet<Concept> set_2 = new HashSet<Concept>();
set_1.add(a);
set_1.add(b);
set_1.add(c);
SetView<Concept> inter = Sets.intersection(set_1,set_2);
System.out.println(inter.size()); ----> I HAVE ZERO !!!
概念a=新概念(“狗”);
概念b=新概念(“树”);
概念c=新概念(“狗”);
HashSet_1=新HashSet();
HashSet_2=新HashSet();
第1组。添加(a);
第1组。添加(b);
集合1.添加(c);
SetView inter=集合交叉点(集合1、集合2);
System.out.println(inter.size());--->我没有!!!
Concept
类只包含String类型的私有成员以及get和set方法。我没有equals()
和hashCode()
首先,您需要重写Concept类上的equals
和hashCode
方法。您不需要第三方库。只用
set_1.retainAll(set2);
set_1.retainal(set2)
将set_1转换为set_1和set_2的交集。(两个集合的交集是只包含两个集合共有的元素的集合。)您将概念放在集合中,而不是字符串-狗,树。您还需要重写概念类的hashcode和equals,使其正常工作这与预期的一样(注意equals和hashcode
在概念
上)
package com.stackoverflow.so19634761;
导入com.google.common.collect.set;
导入com.google.common.collect.Sets.SetView;
导入java.util.Set;
公共类ISect{
公共静态void main(最终字符串[]args){
最终概念a=新概念(“狗”);
最终概念b=新概念(“树”);
最终概念c=新概念(“狗”);
最终集set1=Sets.newHashSet(a);
最终集合set2=集合.newHashSet(b,c);
最终SetView inter=集合交叉点(集合1、集合2);
System.out.println(inter);//=>[概念[data=Dog]]
}
私有静态类概念{
私有最终字符串数据;
//下面的代码是由eclipse生成的。
公共字符串getData(){
返回数据;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((数据==null)?0:data.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
概念其他=(概念)obj;
如果(数据==null){
if(other.data!=null)
返回false;
}如果(!data.equals(other.data))
返回false;
返回true;
}
公共概念(字符串数据){
这个数据=数据;
}
@凌驾
公共字符串toString(){
返回“Concept[data=“+data+”]”;
}
}
}
你能为概念添加代码吗?(特别是equals()
,hashCode()
)它只包含一个字符串类型的私有成员以及get和set方法。我没有equals()和hashCode()。你在集合2中添加了什么?我用覆盖equals()和hashCode()解决了这个问题。非常感谢()!!仅供参考,google collections已被弃用;使用。
package com.stackoverflow.so19634761;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;
import java.util.Set;
public class ISect {
public static void main(final String[] args) {
final Concept a = new Concept("Dog");
final Concept b = new Concept("Tree");
final Concept c= new Concept("Dog");
final Set<Concept> set1 = Sets.newHashSet(a);
final Set<Concept> set2 = Sets.newHashSet(b, c);
final SetView<Concept> inter = Sets.intersection(set1, set2);
System.out.println(inter); // => [Concept [data=Dog]]
}
private static class Concept {
private final String data;
// below this point code was generated by eclipse.
public String getData() {
return data;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Concept other = (Concept) obj;
if (data == null) {
if (other.data != null)
return false;
} else if (!data.equals(other.data))
return false;
return true;
}
public Concept(String data) {
this.data = data;
}
@Override
public String toString() {
return "Concept [data=" + data + "]";
}
}
}