gpt4 book ai didi

java - 包含给出错误结果

转载 作者:行者123 更新时间:2023-12-02 06:57:49 26 4
gpt4 key购买 nike

我有一个“CoAutoria”类,它应该保存“Author”类的 2 个实例(目前只有一个名称)以及这些作者共有的文章数量。
为了找出前 10 位共同作者(关于文章数量),我创建了一个“CoAutoria”的 TreeSet,用于保存每对的文章总数。我需要循环浏览多年 map ,收集不同的作者及其各自的合著者集。然后,对于每一对,创建一个“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() 方法)时,它给出了错误的结果......有时它检查正确A-B 对已经存在于该集合中(以 B-A 的形式),但有时它不存在......据我所读,包含使用 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,这将使有序集合无法工作,因为没有元素更小。另一个例子想象一下,如果您有一个包含元素 [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;
}

关于java - 包含给出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17072374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com