簡體   English   中英

包含給出錯誤的結果

[英]contains giving faulty results

我有一個班級'CoAutoria',它可以容納2個“作者”類的實例(目前只有一個名字)和這些作者共同的文章數量。
為了找出共同作者的前十名(關於文章數量),我創建了一個'CoAutoria'的TreeSet,用於保存每一對的文章總數。 我需要循環瀏覽多年的地圖,收集不同的作者和他們各自的共同作者集。 然后,為每對創建一個'CoAutoria'實例並:將其添加到樹集中(如果它尚不存在); 或者簡單地將其文章數量加到集合上現有的文章中。

我已經創建了compareTo方法,將其插入到樹集上,並創建了equals方法,以便作者的順序無關緊要。

這是主要代碼:`

public class CoAutoria implements Comparable<CoAutoria>
{    
private Autor autor1;
private Autor autor2;
private int artigosComum;
(...) 
}


@Override
public int compareTo(CoAutoria a2)
{
    String thisAutor1 = autor1.getNome();
    String thisAutor2 = autor2.getNome();
    String caAutor1 = a2.getAutor1().getNome();
    String caAutor2 = a2.getAutor2().getNome();
    if((autor1.equals(a2.getAutor1()) && autor2.equals(a2.getAutor2())) || (autor1.equals(a2.getAutor2()) && autor2.equals(a2.getAutor1())))
    {
        return 0;
    }
    else
    {               

       return 1;
    }        
}    
@Override
public boolean equals(Object o)
{
    if(this == o)
    {
        return true;
    }


    if( o == null || o.getClass() != this.getClass())
        return false;

    CoAutoria ca  = (CoAutoria) o;
    String thisAutor1 = autor1.getNome();
    String thisAutor2 = autor2.getNome();
    String caAutor1 = ca.getAutor1().getNome();
    String caAutor2 = ca.getAutor2().getNome();
    if((thisAutor1.equals(caAutor1) && thisAutor2.equals(caAutor2)) || (thisAutor1.equals(caAutor2) && thisAutor2.equals(caAutor1)))
    {
        return true;
    }
    else
    {               
        return false;
    }

}

主要問題是:當我檢查該集合是否已經具有某個'CoAutoria'實例時,(我正在使用TreeSet的contains()方法),它會給我錯誤的結果...有時它會正確檢查該對AB已經存在於該集合中(以BA的形式),但有時它不會......對於我所讀過的內容,contains使用了equals方法,因此不會發生這種情況。

[編輯:]自第一篇文章以來,我開始認為問題可能存在於compareTo ..所以我把它改成了

public int compareTo(CoAutoria a2)
{
String thisAutor1 = autor1.getNome();
String thisAutor2 = autor2.getNome();
String caAutor1 = a2.getAutor1().getNome();
String caAutor2 = a2.getAutor2().getNome();
if(this.equals(a2))
{
    System.out.println("return 0");
    return 0;
}
else
{               
   int aux = thisAutor1.compareTo(caAutor1);
   if(aux != 0)
   {
       return aux;

   }
   else
   {
       return thisAutor2.compareTo(caAutor2);

   }

}        

}

但它仍然給我不好的結果......我想我現在已經想到了:如果它是相同的'CoAutoria',我返回0,如果不是我通過名稱,並按照他們的compareTo值排序..但是缺少一些東西

您的contains方法正在中斷,因為您的compareTo方法始終返回0或正數,沒有負數。 這意味着您的compareTo不一致。 如果作者相同,則正確的實現應返回0,或者當作者不同時,應返回正值負值。

示例(假設author1author2不同):

 int i = author1.compareTo(author2); // i should be positive or negative
 int j = author2.compareTo(author1); // j should be the opposite of i

對於上述兩種情況,您將返回1 ,這將使有序集合不起作用,因為沒有元素smaller 另一個例子想象一下,如果你有一個二元樹(有序集合),它有元素[1-10]。 如果您正在搜索元素5,那么在將5與任何元素進行比較時,您的二叉樹總是會說它等於或大於。

你應該如何改變它取決於你。 但是一個想法是按名稱對作者進行排序,然后迭代兩個集合並按字典順序將作者進行比較。

編輯:即使你的方法編輯后,他們仍然不一致。 嘗試以下方法,它們不是最有效的,但除非您真的想要優化速度,否則應該有效。 請注意,他們首先排序以確保author1和author2在與另一個也進行排序的CoAutor進行比較之前是有序的。 我不做任何空檢查,並假設兩者都是有效的作者。

@Override
public boolean equals(Object o){
    if (o == null || !(o instanceof CoAutoria)) return false;
    if (o == this) return true;
    return this.compareTo((CoAutoria)o) == 0;
}

@Override
public int compareTo(CoAutoria o) {
    List<String> authors1 = Arrays.asList(autor1.getNome(), autor2.getNome());
    List<String> authors2 = Arrays.asList(o.autor1.getNome(), o.autor2.getNome());
    Collections.sort(authors1);
    Collections.sort(authors2);
    for (int i=0;i<authors1.size();i++){
        int compare = authors1.get(i).compareTo(authors2.get(i));
        if (compare != 0)
            return compare;
    }
    return 0;
}

暫無
暫無

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

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