簡體   English   中英

Java中兩組交集的錯誤

[英]Error with Intersection of two sets in Java

我對兩個哈希集的交集有問題。 我不知道為什么一直都是0,因此相似度值為0。

無論如何,我正在發布涉及Intersection的方法。 與聯合對應的部分工作正常。 多謝您的協助。

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();

}

您的問題在於您的比較。

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);

因為您有兩個Set,所以將從該簡單語句獲得並集。

我還不知道原因。 但是我解決了對交點方法的更改:

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-setHashMap API信息

HashMap<Integer, Set<API>> apisPerSystem = new HashMap<Integer, Set<API>>()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM