我有一个“CoAutoria”类,它应该包含一个“作者”类的 2 个实例(目前只有一个名称)以及这些作者共有的文章数量。
为了找出前 10 位共同作者(关于文章数量),我创建了一个“CoAutoria”树集,用于保存每对的文章总数。我需要循环浏览一张地图,收集不同的作者和他们各自的共同作者集。然后,对于每一对,创建一个 '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() 方法),它给了我错误的结果......有时它会正确检查 Pair AB 已经存在于该集合中(以 BA 的形式存在),但有时它不存在......对于我所读到的内容,包含使用 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 值排序..但是缺少一些东西