У меня есть класс «CoAutoria», который должен содержать 2 экземпляра класса «Автор» (у которого пока есть только имя) и количество статей, которые есть у этих авторов. 10 соавторов (относительно количества статей) Я создал TreeSet «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» (я использую метод contains() для TreeSet), он дает ошибочные результаты... иногда он правильно проверяет, что пара AB уже существует в этом наборе (в форме BA), но иногда его нет... Из того, что я читал, в contains используется метод equals, так что этого не должно происходить... верно?
[РЕДАКТИРОВАТЬ:] С момента первого сообщения я начал думать, что, возможно, проблема связана с сравнением.. Поэтому я изменил его на
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.. но чего-то не хватает
compareTo
. Когда функция compareTo работает неправильно, методcontains
для упорядоченных коллекций тоже не работает. - person greedybuddha   schedule 12.06.2013