【发布时间】:2013-06-08 23:18:35
【问题描述】:
我有一个“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() 方法),它给了我错误的结果......有时它检查正确对 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 值排序..但是缺少一些东西
【问题讨论】:
-
在你的例子中没有足够的内容,但是......而不是使用包含,循环,你可能会发现使用 equals() 进行测试也不起作用。
-
@DariusX。问题不在于他的等号,而在于
compareTo函数。当 compareTo 函数不能正常工作时,有序集合的contains方法也不能正常工作。