Java 中两组的交集错误
Error with Intersection of two sets in Java
我在处理两个哈希集的交集时遇到问题。我不知道为什么一直是0,因此相似度值为0。
无论如何,我正在发布涉及交集的方法。 union 对应的部分工作正常。非常感谢您的帮助。
public <T> double Similarity (Set<T> s1, Set<T> s2){
if (s1.isEmpty() || s2.isEmpty()){
return 0.0;
}
double similarity;
int unionValue;
int intersectionValue;
intersectionValue=intersection(s1, s2);
unionValue=union(s1, s2);
similarity=(double)intersectionValue/(double)unionValue;
System.out.println(unionValue+" "+intersectionValue);
System.out.println(similarity);
return similarity;
}
public <T> int intersection (Set<T> s1, Set<T> s2){
Set<T> intersection = new HashSet<T>(s1);
intersection.retainAll(s2);
return intersection.size();
}
public <T> int union (Set<T> s1, Set<T> s2){
Set<T> union = new HashSet<T>(s1);
union.addAll(s1);
for (T apiSwRepo : s2){
if (union.toString().contains(apiSwRepo.toString())){
}
else
union.add(apiSwRepo);
}
return union.size();
}
我还不知道原因。但我解决了它,对交集方法进行了更改:
public <T> int intersection (Set<T> s1,Set<T> s2){
Set<T> intersection = new HashSet<T>();
for (T apiSwRepo:s2){
if (s1.toString().contains(apiSwRepo.toString())){
intersection.add(apiSwRepo);
}
}
return intersection.size();
}
如您所见,我没有使用 intersection.retainAll
,因为它对我的数据不起作用,但在 Set<String>
测试中,它起作用了。
澄清一下,我的 data-set
是 HashMap
的 API
信息
HashMap<Integer, Set<API>> apisPerSystem = new HashMap<Integer, Set<API>>()
你的问题出在你的比较上
if (union.toString().contains(apiSwRepo.toString())) {
} else
union.add(apiSwRepo);
在上面的代码中,您将 Set 转换为 String,然后调用 contains()。相反,你应该像这样在联合体上使用 .contains() :
if (union.contains(apiSwRepo)) {
} else
union.add(apiSwRepo);
我还想建议简化如下:
union.retainAll(s2);
因为你有两个集合,所以你将从这个简单的语句中得到并集。
我在处理两个哈希集的交集时遇到问题。我不知道为什么一直是0,因此相似度值为0。
无论如何,我正在发布涉及交集的方法。 union 对应的部分工作正常。非常感谢您的帮助。
public <T> double Similarity (Set<T> s1, Set<T> s2){
if (s1.isEmpty() || s2.isEmpty()){
return 0.0;
}
double similarity;
int unionValue;
int intersectionValue;
intersectionValue=intersection(s1, s2);
unionValue=union(s1, s2);
similarity=(double)intersectionValue/(double)unionValue;
System.out.println(unionValue+" "+intersectionValue);
System.out.println(similarity);
return similarity;
}
public <T> int intersection (Set<T> s1, Set<T> s2){
Set<T> intersection = new HashSet<T>(s1);
intersection.retainAll(s2);
return intersection.size();
}
public <T> int union (Set<T> s1, Set<T> s2){
Set<T> union = new HashSet<T>(s1);
union.addAll(s1);
for (T apiSwRepo : s2){
if (union.toString().contains(apiSwRepo.toString())){
}
else
union.add(apiSwRepo);
}
return union.size();
}
我还不知道原因。但我解决了它,对交集方法进行了更改:
public <T> int intersection (Set<T> s1,Set<T> s2){
Set<T> intersection = new HashSet<T>();
for (T apiSwRepo:s2){
if (s1.toString().contains(apiSwRepo.toString())){
intersection.add(apiSwRepo);
}
}
return intersection.size();
}
如您所见,我没有使用 intersection.retainAll
,因为它对我的数据不起作用,但在 Set<String>
测试中,它起作用了。
澄清一下,我的 data-set
是 HashMap
API
信息
HashMap<Integer, Set<API>> apisPerSystem = new HashMap<Integer, Set<API>>()
你的问题出在你的比较上
if (union.toString().contains(apiSwRepo.toString())) {
} else
union.add(apiSwRepo);
在上面的代码中,您将 Set 转换为 String,然后调用 contains()。相反,你应该像这样在联合体上使用 .contains() :
if (union.contains(apiSwRepo)) {
} else
union.add(apiSwRepo);
我还想建议简化如下:
union.retainAll(s2);
因为你有两个集合,所以你将从这个简单的语句中得到并集。